47

Spring MVC および JSON を使用すると、AJAX リクエストに対してこの HttpMediaTypeNotAcceptableException エラーが発生し続けます。エラーの完全なスタック トレースは次のとおりです。

 org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.writeWithMessageConverters(AnnotationMethodHandlerAdapter.java:1032)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.handleResponseBody(AnnotationMethodHandlerAdapter.java:972)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.getModelAndView(AnnotationMethodHandlerAdapter.java:921)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:438)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:863)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:851)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:756)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

私が行った小さなグーグルは、リクエストに「accept: application/json」のようなものが含まれている必要があることを示しています..これはfirebugからのリクエストヘッダーです..

Response Headers
Server  Apache-Coyote/1.1
Content-Type    text/html;charset=utf-8
Content-Length  2503
Date    Thu, 25 Aug 2011 21:00:05 GMT
Connection  close

Request Headers
Host    localhost:8080
User-Agent  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 (.NET CLR 3.5.30729)
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/legaldirectory/index.html
Cookie  JSESSIONID=5C97DA19AED4D5FA17F4A58470FAA93B

今、私はここで何が起こっているのか完全に迷っています..他に何が間違ってこのエラーが発生する可能性があります...

4

15 に答える 15

51

Spring xml ファイルに以下が含まれていることを確認してください。

<context:annotation-config/> 

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
  <list>
    <ref bean="jacksonMessageConverter"/>
  </list>
</property>
</bean>

POJO のすべてのアイテムには、ゲッター/セッターが必要です。それが役に立てば幸い

于 2011-08-25T21:35:39.177 に答える
24

から: http://georgovassilis.blogspot.ca/2015/10/spring-mvc-rest-controller-says-406.html

このSpring @RestControllerを取得し、URL パスの一部として電子メールを含む URL をマップしました。ドットの切り捨ての問題 [1] を巧みに回避し、ロールする準備が整いました。そして突然、一部の URL で、Springは 406 [2] を返します。これは、ブラウザーが特定のコンテンツ タイプを要求し、Springがそのコンテンツ タイプへの応答をシリアル化できないことを示しています。要点は、 Springアプリケーションを何年もやっていて、すべての MVC 宣言を正しく行い、Jackson を含めて、基本的に立ち往生しているということです。さらに悪いことに、URL パスの一部の電子メール、特に「.com」ドメインで終わる電子メールでのみそのエラーを吐き出します。

@RequestMapping(value = "/agenda/{email:.+}", method = RequestMethod.GET)
public List<AgendaEntryDTO> checkAgenda(@PathVariable("email") String email)

問題 [3] は非常にトリッキーです: アプリケーション サーバーは何らかのコンテンツ ネゴシエーションを実行し、ブラウザーが実際に送信した要求のどこにも発生していないにもかかわらず、ブラウザーが"application/x-msdownload"コンテンツを要求したことをSpringに納得させます。

解決策は、Web アプリケーション コンテキストのコンテンツ ネゴシエーション マネージャーを指定することです。

<mvc:annotation-driven enable-matrix-variables="true"
    content-negotiation-manager="contentNegotiationManager" />
<bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="defaultContentType" value="application/json" />
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="false" />
    <property name="parameterName" value="mediaType" />
    <property name="ignoreAcceptHeader" value="false" />
    <property name="useJaf" value="false" />
</bean>
于 2016-01-25T22:31:57.623 に答える
19

両方の Jackson jar をクラスパスに追加してください。

  • jackson-core-asl-x.jar
  • jackson-mapper-asl-x.jar

また、Spring xml ファイルに次のものが必要です。

<mvc:annotation-driven />
于 2011-12-27T15:15:41.457 に答える
10

覚えておくべき重要なこと: 3.1.2 より前の Spring バージョンは、JACKSON 1.x と互換性があり、JACKSON 2.x とは互換性がありません。これは、JACKSON 1.x から 2.x に移行して、クラスのパッケージ名が変更されたためです。JACKSON 1.x ではクラスは org.codehaus.jackson の下にあり、JACKSON 2.x では com.fasterxml.jackson の下にあります。

この問題に対処するために、Spring 3.1.2 以降、MappingJacksonHttpMessageConverter を置き換える新しい MappingJackson2HttpMessageConverter が追加されました。

このリンクで互換性の問題に関する詳細を見つけることができます: Spring で無視される Jackson アノテーション

于 2013-05-01T21:08:01.013 に答える
5

WebMvcConfigurerAdapterを拡張する Spring @Configurationクラスで、メソッド configureMessageConverters をオーバーライドします。たとえば、次のようになります。

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

    // http
    HttpMessageConverter converter = new StringHttpMessageConverter();
    converters.add(converter);
    logger.info("HttpMessageConverter added");

    // string
    converter = new FormHttpMessageConverter();
    converters.add(converter);
    logger.info("FormHttpMessageConverter added");

    // json
    converter = new MappingJackson2HttpMessageConverter();
    converters.add(converter);
    logger.info("MappingJackson2HttpMessageConverter added");

}

そして、エラーはなくなります。

于 2015-05-11T07:59:21.030 に答える
0

回答の 1 つでAlexが示唆したように、ContentNegotiationManagerFactoryBean を使用してデフォルトのコンテンツ タイプを「application/json」に設定できますが、そのアプローチは私には向いていないと感じました。

私がやろうとしていたのは、このようなメソッドにフォームを投稿することでした

@RequestMapping(value = "/post/to/me", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public @ResponseBody MyJsonPOJO handlePostForm(@Valid @ModelAttribute("form") ValidateMeForm form, BindingResult bindingResult) throws ApiException {

私が代わりに選択したのは、ブラウザーからのリクエストの「Accept」ヘッダーを「application/json」に変更することでした。これにより、SpringMVC が私のメソッドを見つけます。

(まだ確定していない) Javascript Fetch API を使用する:

var form = new FormData();
form.append("myData", "data");

let fetchConfig = {
    method: "POST",
    body: form,
    headers: {"Accept": "application/json"}
};

fetch("/post/to/me", fetchConfig)
    .then(... // Javascript Promise API here

ほら!これで、SpringMVC がメソッドを見つけてフォームを検証し、JSON POJO を返せるようになります。

于 2016-07-02T17:09:53.337 に答える
0
response.setHeader("Accept",  "application/json");
于 2013-01-13T10:18:39.343 に答える