我试图在spring beans配置文件中配置jaxb2Marshaller,但我对Spring和JAXB很新,所以我可能会采用错误的方式.
我想要实现的是同一个bean,它将编组/解组基于2个不同模式的2个不同的类.也许那是不可能的,因为当我配置并运行我的测试时,他们在配置(AccountResponse)中的第二个类失败了.
这是XML配置:
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="marshallerProperties">
<map>
<entry key="com.sun.xml.bind.namespacePrefixMapper">
<bean id="NamespacePrefixMapperImpl" class="org.lp.soa.controller.xml.LpsNamespacePrefixMapper" />
</entry>
</map>
</property>
<property name="classesToBeBound">
<list>
<value>org.lp.soa.controller.data.request.AccountRequest</value>
<value>org.lp.soa.controller.data.response.AccountResponse</value>
</list>
</property>
<property name="schemas">
<list>
<value>classpath:schema/AccountRequest.xsd</value>
<value>classpath:schema/AccountResponse.xsd</value>
</list>
</property>
</bean>
如果我从配置中注释掉AccountRequest.xsd值,然后再次运行我的测试,那么第二个类(AccountResponse)的编组/解组它们都会通过,如果我取消注释它,我会得到错误:org.xml.sax.SAXParseException :cvc-elt.1:找不到元素’accountResponse’的声明.
我是以错误的方式去做的吗?难道不应该用两个模式处理两个类吗?
谢谢,
约阿夫.
解决方法:
”
if i comment out the AccountRequest.xsd value from the config and then
run my tests again the marshal/unmarshal for the second class
(AccountResponse) they all pass, if I then uncomment it I get the
error: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the
declaration of element ‘accountResponse’.
“
听起来像SchemaFactory.newSchema()创建的Schema对象只处理列表中的第一个xsd.
如果你有多个模式文件在同一个命名空间(targetNamespace?),那么可能是这个bug造成了麻烦:
https://issues.apache.org/jira/browse/XERCESJ-1130
我解决这个错误的方法是创建一个包含其他xsd文件的父xsd文件,然后使用LSResourceResolver实现在xml配置中设置“schemaResourceResolver”属性(例如参见http://blog.frankel.ch/xml-validation-with-importedincluded-schemas).
在您的xml配置中添加以下内容:
parent.xsd文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.yourdomain.com/FIXED/EXAMPLE"
targetNamespace="http://www.yourdomain.com/FIXED/EXAMPLE"
elementFormDefault="qualified"
version="1.000"
id="some_id">
<xs:include schemaLocation="AccountRequest.xsd"/>
<xs:include schemaLocation="AccountResponse.xsd"/>
</xs:schema>
在xml配置中,将schemas属性更改为:
<property name="schemas">
<list>
<value>classpath:schema/parent.xsd</value>
</list>
</property>
标签:jaxb2,java,spring,xml
来源: https://codeday.me/bug/20190826/1728796.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。