【问题标题】:Spring MVC: @ResponseBody, 415 Unsupported Media TypeSpring MVC:@ResponseBody,415 不支持的媒体类型
【发布时间】:2023-03-04 22:11:01
【问题描述】:

我在将 JSON Post 映射到特定 Java 对象以通过 Hibernate

保存它时遇到问题

正确设置了 Ajax 调用的标头...

Accept          application/json
Content-Type    application/json; charset=UTF-8

HTTP 方法是 POST

我的配置来了...

我的 Spring MVC 函数映射是这样的

@RequestMapping(value = {"/save.json"},method = RequestMethod.POST)
public ModelMap save(@RequestBody Seizure seizureObj,Model model) {
   ...
}

在我的容器 xml 中,我有一个像这样的 ContentNegotiatingViewResolver

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
        <map>
            <entry key="html" value="text/html" />
            <entry key="json" value="application/json" />
        </map>
    </property>
    <property name="viewResolvers">
        <list>
            <bean id="viewResolver"
                class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/assets/" />
                <property name="suffix" value=".jsp" />
            </bean>
        </list>
    </property>
    <property name="defaultViews">
        <list>
            <bean
                class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                <property name="prefixJson" value="false" />
                <property name="objectMapper" ref="jacksonObjectMapper" />
            </bean>
        </list>
    </property>
</bean>

在我的容器 xml 中,杰克逊的部分

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterConfigurer"
    init-method="init">

    <property name="messageConverters">
        <list>
            <bean id="marshallingHttpMessageConverter"
                class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
          >
          <property name="objectMapper" ref="jacksonObjectMapper" />
          </bean>
        </list>
    </property>
</bean> 

<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> 

我有

  • jackson-core-asl-1.8.5
  • jackson-mapper-asl-1.8.5

在我的 /lib 文件夹中

Jackson 适用于这样一个简单的案例

public class Simple {
  private int id;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }   
}

@RequestMapping(value = {"/saveSimple.json"},method = RequestMethod.POST)
public ModelMap save(@RequestBody Simple simple,Model model) {
   ...
}

当我用 curl 测试它时

 curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":1}'  http://<URL>/saveSimple.json

没问题,但如果我用 Hibernate 对象测试它,我会收到消息

415 Unsupported Media Type

任何想法。

【问题讨论】:

    标签: hibernate spring-mvc jackson


    【解决方案1】:

    我遇到了类似的问题,这是因为我的一个类有一个非原始键类型的映射。我能够@JsonIgnore 到这个字段来解决这个问题。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。在阅读了 MappingJacksonHttpMessageConverter 的工作原理后,我意识到我没有正确初始化它。 所以我在我的 rest-servlet.xml 中使用了以下内容,它工作了..

      <bean id="jsonHttpMessageConverter"  class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
          <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
          <property name="mediaTypes">
              <map>
                  <entry key="json" value="application/json" />
              </map>
          </property>
      
          <property name="defaultViews">
              <list>
                  <bean
                      class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                      <property name="objectMapper">
                          <ref bean="JacksonObjectMapper" />
                      </property>
                  </bean>
              </list>
          </property>
          <property name="favorPathExtension" value="false" />
          <property name="favorParameter" value="true" />
          <property name="useNotAcceptableStatusCode" value="true" />
      </bean>
      
      <bean id="JacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" />
      

      【讨论】:

        【解决方案3】:

        StanMax 带领我朝着正确的方向前进...

        首先我必须正确设置@JsonManagedReference 和@JsonBackReference。我将 ManagedReference 设置为代表 ONE-to-MANY 关系的 ONE 的属性,但显然您必须将其设置为 MANY 属性(集合)

        在此处查看说明 http://wiki.fasterxml.com/JacksonFeatureBiDirReferences

        @JsonBackReference 是引用的“后退”部分:序列化时会省略,前向引用反序列化时会重新构造。

        • 带注释的属性必须是 bean 类型

        我的问题是我没有在我的 JSON POST 中发送足够的信息来匹配 Hibernate 要求。

        这导致了一个异常,即从我的 JSON POST 中创建 Hibernate 对象的正确字段不存在。

        我创建了一个测试 url,我自己在其中创建了对象映射器,并尝试手动反序列化 JSON。这会引发正确的错误消息。

        在我看来,Spring 不幸抛出了 415“不支持的媒体类型”异常,这有点误导。

        所以对于未来。首先手动尝试(参见示例),然后继续。

         ModelMap map = new ModelMap();
         logger.info("HibernateAware");
         HibernateAwareObjectMapper mapper = new HibernateAwareObjectMapper();
         String jsonInput = 
         "{" +
           "\"id\":\"1\"," +
           "\"matCountry\":{" +
             "\"id\":\"1\"" +
           "}" +
         "}";
         Seizure seizure = mapper.readValue(jsonInput, Seizure.class); // this line throw the exception
        

        希望这对某人有所帮助。

        问候 JS

        【讨论】:

        • 这完全节省了我的一天......一周。确实是误导性的错误信息!这怎么可能?
        • @JeremyS。救救我 ! +1
        【解决方案4】:

        您可以尝试的一件事是确定问题是否出在 Jackson 的数据绑定(无法序列化休眠对象)或其他问题上。这可以通过手动构造 ObjectMapper 来完成,检查“mapper.serializeValueAsString()”是否有效或抛出异常。

        这很有可能与 Jackson 处理延迟加载的属性有关;如果是这样,您可能需要使用jackson hibernate module,因为它可以处理特定于 Hibernate 的详细信息。

        【讨论】:

        • 我收到错误消息'defaultReference': back reference type (java.util.Set) not compatible with managed type (&lt;MyClassName&gt;)
        猜你喜欢
        • 2013-08-08
        • 2017-05-20
        • 2014-11-04
        • 1970-01-01
        • 2013-01-13
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        • 1970-01-01
        相关资源
        最近更新 更多