Hybris:如何在wsDTO bean的XML根元素上添加@XmlAttribute?
在Hybris WS DTO的XML根元素添加属性的解决方案
你遇到的问题是:即使在ProductCategorySearchPageWsDTO的att字段添加了@XmlAttribute注解,且在WS DTO的XML配置中做了对应设置,返回的XML里att仍以子元素而非根元素属性的形式出现。以下是针对性的解决步骤:
1. 统一JAXB注解的应用方式
Hybris的XML序列化依赖JAXB,注解的生效优先级和访问类型是关键:
- 确保DTO类上添加
@XmlAccessorType(XmlAccessType.FIELD),指定JAXB直接通过字段而非getter/setter方法识别注解,避免父类配置干扰。 - 根元素注解和属性注解直接写在Java类中,无需在XML配置中重复定义(XML配置主要用于WS元数据/文档生成,不直接控制JAXB序列化)。
示例正确的Java类代码:
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessType; @XmlRootElement(name = "ProductCategorySearchPage") @XmlAccessorType(XmlAccessType.FIELD) public class ProductCategorySearchPageWsDTO extends ProductSearchPageWsDTO { @XmlAttribute private String att; // 保留标准getter/setter public String getAtt() { return att; } public void setAtt(String att) { this.att = att; } }
2. 检查父类的JAXB配置
父类ProductSearchPageWsDTO的JAXB配置可能影响子类:
- 如果父类使用了
@XmlAccessorType(XmlAccessType.PROPERTY)(JAXB默认值),子类需要显式指定XmlAccessType.FIELD才能让字段上的@XmlAttribute生效。 - 确保父类没有覆盖子类的序列化行为,比如没有使用
@XmlTransient或其他冲突注解。
3. 清理并重建Hybris服务
- 执行
ant clean all清除旧的编译文件和生成的元数据。 - 重启Hybris服务器,确保新的注解配置被加载。
4. 验证消息转换器配置
确认Hybris使用默认的JAXB消息转换器处理XML序列化:
- 检查
commercewebservices-spring.xml中是否存在自定义的HttpMessageConverter,如果有,确保它不会覆盖JAXB对注解的解析逻辑。
内容的提问来源于stack exchange,提问作者Mitja
相关产品推荐
相关产品推荐

