Spring MVC:@ ResponseBody,415不支持的媒体类型


问题内容

我无法将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" />

我有

  • 杰克逊核心-asl-1.8.5
  • 杰克逊-映射器-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 -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":1}'  http://<URL>/saveSimple.json

没问题,但是如果我使用Hibernate对象对其进行测试,则会收到消息

415 Unsupported Media Type

有任何想法吗。


问题答案:

StanMax引领我朝着正确的方向前进…

首先,我必须设置@JsonManagedReference@JsonBackReference。我设置了ManagedReference的属性,它代表了
ONE 的的 一个一对多 的关系,但显然你必须将其设置为 MANY 属性(集合)

请参阅此处的说明
http://wiki.fasterxml.com/JacksonFeatureBiDirReferences

@JsonBackReference是引用的“后退”部分:序列化将省略它,并在对前向引用进行反序列化期间对其进行重新构造。

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

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

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

我创建了一个测试URL,自己在其中创建了Object映射器,并尝试手动反序列化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