Jer*_* S. 6 hibernate spring-mvc jackson
我无法将JSON Post映射到特定的Java对象以通过Hibernate保存它
正确设置Ajax调用的标头...
Accept application/json
Content-Type application/json; charset=UTF-8
Run Code Online (Sandbox Code Playgroud)
并且HTTP方法是POST
这是我的配置......
我的Spring MVC函数映射看起来像这样
@RequestMapping(value = {"/save.json"},method = RequestMethod.POST)
public ModelMap save(@RequestBody Seizure seizureObj,Model model) {
...
}
Run Code Online (Sandbox Code Playgroud)
在我的容器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>
Run Code Online (Sandbox Code Playgroud)
在我的容器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" />
Run Code Online (Sandbox Code Playgroud)
我有
在我的/ lib文件夹中
杰克逊就是为这样一个简单的案子工作的
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) {
...
}
Run Code Online (Sandbox Code Playgroud)
当我用卷曲测试它
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":1}' http://<URL>/saveSimple.json
Run Code Online (Sandbox Code Playgroud)
没有问题,但如果我用Hibernate对象测试它,我会得到消息
415 Unsupported Media Type
Run Code Online (Sandbox Code Playgroud)
有任何想法吗.
Jer*_* S. 13
StanMax带领我走向正确的方向......
首先,我不得不设置@JsonManagedReference和@JsonBackReference权利.我将ManagedReference设置为表示ONE-to-MANY关系中的ONE之一的属性,但显然您必须将其设置为MANY属性(集合)
请参阅此处的说明 http://wiki.fasterxml.com/JacksonFeatureBiDirReferences
@JsonBackReference是引用的"后退"部分:它将从序列化中省略,并在前向引用的反序列化期间重新构造.
- 带注释的属性必须是bean类型
我的问题是我没有在我的JSON POST中发送足够的信息来匹配Hibernate的要求.
这导致了一个异常,即从我的JSON POST创建Hibernate对象的正确字段不存在.
我创建了一个测试网址,我自己创建了Object mapper,并尝试手动反序列化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
Run Code Online (Sandbox Code Playgroud)
希望这有助于某人.
关心JS
| 归档时间: |
|
| 查看次数: |
18839 次 |
| 最近记录: |