10

乙女座 Web サーバーの学習を始めたばかりです。Spring MVC アプリケーションで Jakcson JSON を操作しようとしています。この段階では、GET リクエストのシリアル化されたオブジェクトを取得できません。サーバーは「406 Not Acceptable」を返します。

The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers ().

Rome と JAXB2 を使用すると、同じ問題が発生します。

プロジェクト構成ファイルとコードは次のとおりです。

フラグメント pom.xml:

<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>com.springsource.org.codehaus.jackson</artifactId>
  <version>1.0.0</version>
</dependency>
<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>com.springsource.org.codehaus.jackson.mapper</artifactId>
  <version>1.0.0</version>
</dependency>

マニフェスト.MF

Manifest-Version: 1.0
Import-Bundle: com.springsource.org.apache.taglibs.standard;version="[
 1.1.2,1.3)",com.springsource.org.codehaus.jackson;version="[1.0.0,1.0
 .0]",com.springsource.org.codehaus.jackson.mapper;version="[1.0.0,1.0
 .0]"
Bundle-Version: 2.3.0
Tool: Bundlor 1.0.0.RELEASE
Bundle-Name: GreenPages Web
Import-Library: org.springframework.spring;version="[3.0, 3.1)"
Bundle-ManifestVersion: 2
Bundle-SymbolicName: greenpages.web
Web-ContextPath: greenpages
Import-Package: javax.servlet.jsp.jstl.core;version="[1.1.2,1.2.0)",ja
 vax.sql,org.apache.commons.dbcp,org.eclipse.virgo.web.dm;version="[2.
 0.0, 3.0.0)",org.springframework.core.io;version="[3.0.0.RELEASE,3.1.
 0)",org.springframework.stereotype;version="[3.0.0.RELEASE,3.1.0)",or
 g.springframework.ui;version="[3.0.0.RELEASE,3.1.0)",org.springframew
 ork.web.bind.annotation;version="[3.0.0.RELEASE,3.1.0)",org.springfra
 mework.web.servlet.mvc.annotation;version="[3.0.0.RELEASE,3.1.0)",org
 .springframework.web.servlet.view;version="[3.0.0.RELEASE,3.1.0)"

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

  <welcome-file-list>
    <welcome-file>/WEB-INF/pages/index.jsp</welcome-file>
  </welcome-file-list>

  <!-- CONFIGURE A PARENT APPLICATION CONTEXT -->
  <context-param>
    <param-name>contextClass</param-name>
    <param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
  </context-param>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- DISPATCHER SERVLET CONFIG -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

</web-app>

dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <context:component-scan base-package="greenpages.web"/>

    <!-- Configures the @Controller programming model -->
    <mvc:annotation-driven />

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

GreenPagesController.java

package greenpages.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class GreenPagesController {

 @RequestMapping("/home.htm")
 public void home() {
 }

 // MappingJacksonHttpMessageConverter (requires Jackson on the classpath - particularly useful for serving JavaScript clients that expect to work with JSON)
 @RequestMapping(value="/json.htm", method=RequestMethod.POST)
 public @ResponseBody String readJson(@RequestBody JavaBean bean) {
  return "Read from JSON " + bean;
 }

 @RequestMapping(value="/json.htm", method=RequestMethod.GET)
 public @ResponseBody Object writeJson() {
  return new Object();
 }

}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
   <title>Simple jsp page</title>
   <script type="text/javascript" src="/greenpages/scripts/jquery-1.4.4.min.js"></script>
   <script type="text/javascript">
  $.getJSON("json.htm", function(message) {
   console.log(message);
  });
   </script>
  </head>
  <body>

  <form action="test.htm" method="get">
      <input type="text" name="name">
      <input type="submit">
  </form>

  </body>
</html>

AJAX リクエストhttp://localhost:8080/greenpages/json.htm : Firebug からのリクエスト ヘッダー:

GET /greenpages/json.htm HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: http://localhost:8080/greenpages/
Cookie: JSESSIONID=18000E4E096D7978F61F5D1E8105B784; JSESSIONID=35FB0925786699EC587A1B64F30517AD

応答ヘッダー:

HTTP/1.1 406 Not Acceptable
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1070
Date: Tue, 07 Dec 2010 11:15:58 GMT

問題は何でしょうか?

4

11 に答える 11

23

json コンバーターが見つからない場合、Spring はフォールバックして 406 を返します。

jackson jar が実際に webapp の lib ディレクトリにデプロイされていることを確認します。これが私の場合の問題でした。

于 2011-08-17T10:11:46.407 に答える
16

<mvc:annotation-driven>入っていることを確認してくださいdispatcher-servlet.xml- @ResponseBody.

また、コンテキスト構成に混乱があることもわかります-のコンテキストdispatcher-servlet.xmlを構成するために使用されます。親コンテキストでDispatcherServlet指定するべきではありません。contextConfigLocation

于 2010-12-07T13:18:14.860 に答える
2

詳細については、 http://www.checkupdown.com/status/E406.htmlを参照してください。クライアント アプリは、返送されるデータの種類を受け入れないことをサーバーに伝えています。

私はあなたが使用しているライブラリなどに精通していませんが、受け入れヘッダーをプログラムで (または Firebug などを介して) 見て、何が設定されているかを確認できるはずです。うまくいけば、ソースコード/構成でそれを見つけることができます。

推測では、あなたのクライアントは JSON が戻ってくることを要求しており、サーバーはそれを送信していないと思います。

于 2010-12-07T09:54:52.840 に答える
1

同じ問題に遭遇しましたが、次のことが原因ではないかと思います。

AnnotationDrivenBeanDefinitionParserクラスは、jaxb2/jacksonの可用性についてクラスパスをチェックする役割を果たします。これを行うには、次のロジックを使用します。

private static final boolean jaxb2Present =
        ClassUtils.isPresent("javax.xml.bind.Binder", AnnotationDrivenBeanDefinitionParser.class.getClassLoader());

現在、通常、バンドルのアプリケーションコンテキストはosgi対応のクラスローダーを提供します。ただし、jaxb2present変数は静的であるため、クラスがロードされると、アプリケーションコンテキストによってインスタンス化される前に、静的に設定されます。その時点では、クラスローダーはosgiを認識していないため、探しているクラスを見つけることができないと思います。

今のところ、唯一の回避策はJaxb2HttpMessageConverterを手動で接続することだと思います(これはまだ方法がわかりません:-)

于 2012-04-02T23:16:03.263 に答える
0

@axtavt AnnotationMethodHandlerAdapterに明示的な宣言がないということは、どういう意味ですか。サーブレットファイルに次の宣言があり、404を取得しています。

<bean
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonConverter" />
        </list>
    </property>
</bean>

<bean id="jsonConverter"
    class="com.clickable.pro.data.bll.internal.response.MyMappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json" />
    <property name="objectMapper" ref="jaxbJacksonObjectMapper" />
    <property name="prefixJson" value="true"></property>
    <property name="prefixJsonString" value="while(1);"></property>
</bean>
于 2011-08-10T11:07:46.813 に答える
0
@RequestMapping(value = "/{cid}/{lid}/newslice", method = RequestMethod.POST)

public @ResponseBody

int addSlice(@PathVariable int cid, @PathVariable int lid, @RequestParam("t") String t) {

}

これは 406 エラーを返します。戻り型intを String にすると、問題はなくなりました。

于 2013-07-03T08:55:12.837 に答える
0

同じエラーが発生しました。しかし、私は Java アノテーションを使用しました。必要な依存関係はすべてあります。しかし、私は注釈を付けるのを逃しました

@EnableWebMvc 

私の@Configurationクラス

于 2014-12-12T16:13:57.037 に答える
0

@ResponseBody を取り除くだけです。

于 2014-03-21T19:26:44.497 に答える
0

返そうとした Java オブジェクトにクラス定義の上に XmlRootElement の注釈が付けられていなかったため、406 エラーが発生するという同様の問題がありました。Accepts=application/json ヘッダーをリクエストに含めた場合、メソッドは問題なく JSON を返しましたが、リクエストに Accept=application/xml ヘッダーを含めた場合は 406 を返しました

Postmanを使用してヘッダーを変更し、応答を表示しました。非常に便利なツールです。

于 2014-04-03T17:31:13.490 に答える