遇到一个奇怪的问题,在使用@RequestBody解析XML时,下面这个类在解析后,ToUserName是空的。
@XmlRootElement(name = "xml")
public class MMM {
private String ToUserName;
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
@Override
public String toString() {
return "MMM{" +
"ToUserName='" + ToUserName + '\'' +
'}';
}
}
一开始怀疑解析xml的HttpMessageConverter没有配置好,然后加入了自定义的HttpMessageConverter,发现HttpMessageConverter没有问题,在使用中。
深入debug,发现数据没有问题,在下面这里转换后结果为空:
Unmarshaller unmarshaller = createUnmarshaller(clazz);
if (clazz.isAnnotationPresent(XmlRootElement.class)) {
return unmarshaller.unmarshal(source);
}
unmarshal 为什么会失败呢,多方测试,找到了解决方法:
@XmlElement //1.加这个注释可以转换成功
private String ToUserName;
//2.使用public也可以转换成功
public String ToUserName;
难道unmarshaller不支持private+setter/getter方法吗? 一开始我是这样以为的,但是后面又遇到问题,在一次对像转换到xml的时候,我发现使用private+setter/getter方法的情况下,转出来的xml字段是小写开头的!! 原来如此。
因为成员ToUserName是大写开头的,而unmarshaller在检查到getToUserName后,会猜测变量名为toUserName,所以xml转对像时ToUserName是空的。
为什么我要大写ToUserName? 因为微信公众号开发这个坑,不解释了,谁用谁知道。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。