Xml Spring MVC REST中对象的映射
因此,我对SpringMVC还相当陌生,一直在构建一个应用程序,它承载+使用了多个API,大部分都工作正常,但我现在遇到了麻烦 由于某些原因,xml中的属性不会映射到对象中。我对JSON没有这个问题,但不幸的是,在这种情况下,我处于接收端,无法更改请求的格式。 请求有效负载类似于:Xml Spring MVC REST中对象的映射,xml,spring,rest,spring-mvc,Xml,Spring,Rest,Spring Mvc,因此,我对SpringMVC还相当陌生,一直在构建一个应用程序,它承载+使用了多个API,大部分都工作正常,但我现在遇到了麻烦 由于某些原因,xml中的属性不会映射到对象中。我对JSON没有这个问题,但不幸的是,在这种情况下,我处于接收端,无法更改请求的格式。 请求有效负载类似于: <xml> <ToUserName> <![CDATA[toUser]]> </ToUserName> <FromUserName> <![CDA
<xml>
<ToUserName> <![CDATA[toUser]]> </ToUserName>
<FromUserName> <![CDATA[fromUser]]> </FromUserName>
<CreateTime> 1348831860 </CreateTime>
<MsgType> <![CDATA[text]]> </MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
看起来应该有用,对吧?
好吧,输出是这样的
ReceivedMessage{toUserName=null, fromUserName=null, createTime=null, msgType=null, msgId=null, medes=null, content=null, picUrl=null, format=null, thumbMediaId=null, location_X=null, location_Y=null, label=null, scale=null, title=null, description=null, url=null, recognition=null, event=null, eventKey=null, ticket=null, latitude=null, longitude=null, precision=null}
如您所见,所有属性都为null,即使是有效负载中提供的属性
我假设这可能与有效载荷的结构有关,但正如我所说的,我无法改变这一点
非常感谢您的帮助,谢谢
编辑:修复了标题中的打字错误。。。
编辑2:进一步的信息。。。servlet配置的相关部分:
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
<bean id="xmlConverter" class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter"/>
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
<ref bean="xmlConverter" />
</list>
</property>
</bean>
Jaxb2RootElementHttpMessageConverter
用于将Java对象转换成XML或从XML转换成Java对象。如果满足以下条件,则消息转换工作:
- 如果类路径上存在JAXB2,则此转换器是预启用的李>
- java类应该有xml到java绑定的详细信息
@XmlRootElement
public class Customer {
String name;
int id;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
@XmlAttribute
public void setId(int id) {
this.id = id;
}
}
因为您希望将XML转换为java对象,反之亦然,所以需要使用JAXB进行编组和解编组。spring中有现成的消息转换器,如Jaxb2RootElementHttpMessageConverter,可能会有所帮助。请共享
ReceivedMessage
类的内容。@Mithun类已添加,目前正在查看Jaxb2RootElementHttpMessageConverterwas在添加(name=“xml”)之前引发未知元素异常对于XmlRootElement注释,现在可以了,但结果与开始时相同,全部为null不确定这是否是问题所在。请您重新命名这些标记,使其与java类中的变量名相同。由于我不能更改xml输入(它来自第三方API),我决定删除getter/setter,公开变量,并将它们重命名为大写字母开头。这很有效。它并不理想,因为它打破了封装和命名约定,但鉴于这种情况,它似乎是必要的。谢谢你的帮助
public class ReceivedMessage{
//common
private String toUserName;
private String fromUserName;
private Long createTime;
private String msgType;
private Long msgId;
private String medes;
//text
private String content;
//image
private String picUrl;
//voice + speech recognition
private String format;
//video
private String thumbMediaId;
//location
private Double location_X;
private Double location_Y;
private String label;
private Double scale;
//link
private String title;
private String description;
private String url;
//speech recognition
private String recognition;
//event + QR code scan + location incident + menu event
private String event;
//QR code scan + menu event
private String eventKey;
//QR code scan
private String ticket;
//location incident
private Double latitude;
private Double longitude;
private Double precision;
public ReceivedMessage() {
}
}
@XmlRootElement
public class Customer {
String name;
int id;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
@XmlAttribute
public void setId(int id) {
this.id = id;
}
}