我无法连接所有允许从ajax客户端发送的xml被解组为Java对象的部分。我正在使用Jquery用于ajax客户端,Spring3和JAXB。以下是关键组件:
Ajax客户端
function checkForNewActivities(activities) {
$j.ajax({
url: "upload/checkForNewActivities",
type: "POST",
async: true,
dataType: "xml",
data: ({activities:activities}),
contentType: "application/xml",
beforeSend: function() {
alert("sending ajax");
},
complete: function() {
alert("ajax sent");
},
success: function(data) {
alert("success");
},
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus + errorThrown);
}
});
}
Spring配置
<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="jaxbMarshaller" />
<property name="unmarshaller" ref="jaxbMarshaller" />
<property name="supportedMediaTypes" value="application/xml"/>
</bean>
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
a bunch of java classes
</list>
</property>
</bean>
以下是作为目标的Spring Controller方法:
@RequestMapping(value="/checkForNewActivities",headers="application/xml", method=RequestMethod.POST)
public @ResponseBody String uploadMultipleWorkouts(@RequestBody String activities) {
System.out.println(activities);
return "";
}
使用RequestMapping中的headers =“application / xml”,永远不会调用此方法。如果我删除了头文件param,那么调用该方法并将活动转储到控制台显示转义的xml。
我显然不知道如何将此方法连接到spring配置,以便进行解组xml。
答案 0 :(得分:2)
println打印出转义xml的原因是因为变量activities
的数据类型为String
。您需要创建一个类来保存将传递给方法的数据,以便JAXB可以将结构转换为xml。
例如,而不是
public @ResponseBody String uploadMultipleWorkouts(@RequestBody String activities) {
你想要
public @ResponseBody Activities uploadMultipleWorkouts(@RequestBody Activities activities) {
其中Activities
是您使用适当的getter和setter定义的类,以便可以分配您传入的xml数据。如果请求数据和响应数据必须不同,那么您可以简单地定义两个类,即请求和响应变体。
至于为何使用headers="application/xml"
搞砸了,请尝试将其设置为headers = {"content-type=application/xml"}