【问题标题】:Jaxb annotation @xmlelement(name="ElementName") not binding with xml element nameJaxb 注释 @xmlelement(name="ElementName") 未与 xml 元素名称绑定
【发布时间】:2017-11-16 10:19:02
【问题描述】:

我的 Spring MVC Web Service 代码如下。

模型类

@XmlRootElement(name="wrappedSecretData")
public class VendorData {


        private long lKeyId;



        @XmlElement(name="keyId")
        public long getlKeyId() {
            return lKeyId;
        }


        public void setlKeyId(long lKeyId) {
            this.lKeyId = lKeyId;
        }       
    }

控制器方法

 @RequestMapping(value = "/vendor", method = RequestMethod.POST)
        public String addVendor(@RequestBody VendorData vendorData) {

            /*Checking recieved value*/
            System.out.println(vendorData.getlKeyId());//**Returning 0 value **
            return "Success";
        }

Web 服务的 XML 请求正文

<wrappedVendorSecretsMetadata>
    <keyId>1</keyId>
</wrappedVendorSecretsMetadata>

我在 lKeyId(粗体注释)中得到“0”值。 我在哪里做错了。 请提供使用 @XmlElement(name="keyId") 注释将 xml 元素绑定到对象成员的正确方法。

【问题讨论】:

  • VendorData 类解组您的示例 XML 对我来说很好(包括 lKeyId = 1)。所以,问题可能出在您没有显示的 Java 代码部分。
  • 我已经添加了我的网络服务的完整代码。请帮助我我在哪里做错了。我在解组它时遇到问题。我该如何解组它?
  • wrappedSecretData != wrappedVendorSecretsMetadata

标签: java xml spring-mvc jaxb unmarshalling


【解决方案1】:

我认为您只需要在变量声明上使用 @XmlElement。

【讨论】:

  • 我在变量声明中使用了@XmlElement,但仍然无法正常工作。
【解决方案2】:

试试这个:

@XmlRootElement(name="wrappedVendorSecretsMetadata")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class VendorData {

    private long lKeyId;

    public VendorData(){

    }

    @XmlElement(name="keyId")
    public long getlKeyId() {
        return lKeyId;
    }

    public void setlKeyId(long lKeyId) {
        this.lKeyId = lKeyId;
    }       
}

【讨论】:

  • 我尝试了相同的解决方案,但仍然没有从 xml 获取 keyId 元素名称到 lKeyId 类成员名称。在 lKeyId 中获取 0 值。请帮忙...
  • 尝试将long更改为Long
【解决方案3】:

默认情况下,注释不适用于 jaxb 中的 XmlMapper。为此,您必须注册注释模块,就像我在以下代码块中所做的那样:

String xmlData = getMyXmlData();
ObjectMapper objectMapper = new XmlMapper();
objectMapper.registerModule(new JaxbAnnotationModule());        
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MyClass myObj= objectMapper.readValue(xmlData , MyClass.class); 

在您的情况下,您必须覆盖 Xml 到 Object 的绑定过程。为此,您可以在控制器中接收 HttpRequest,然后使用您自己的 java 代码将 xml 数据转换为 VendorData。

【讨论】:

  • 以何种方式适用于 Spring MVC 将 XML 数据解组到 @RequestBody 带注释的参数中? Spring MVC 为您做这件事的全部意义在于,您不必自己弄乱ObjectMapper 之类的东西。为什么你甚至认为它使用ObjectMapper,而不是 JAXB 本身?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多