Unmarshaller转换xml到对像为空的问题

遇到一个奇怪的问题,在使用@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? 因为微信公众号开发这个坑,不解释了,谁用谁知道。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值