从2.2.7开始,使用JAXB-RI实现的解组失败

从2.2.7开始,使用JAXB-RI实现的解组失败,jaxb,Jaxb,我们正在升级到JAXB-RI实现的新版本。但是,使用com.sun.xml.bind:jaxb impl:2.2.7以后的版本,我们的解组代码失败。如果我们切换回版本2.2.6,它将正确解组 我在对象类上尝试了各种注释组合。问题似乎与XmlBars.getbar方法有关,该方法不再返回子Bar元素 我在org.glassfish.jaxb:jaxb运行时和最新的Moxy上都尝试过,它们表现出相同的行为 JUnit5测试中显示了一个失败的示例: package.com公司; 导入org.junit

我们正在升级到JAXB-RI实现的新版本。但是,使用
com.sun.xml.bind:jaxb impl:2.2.7
以后的版本,我们的解组代码失败。如果我们切换回版本2.2.6,它将正确解组

我在对象类上尝试了各种注释组合。问题似乎与
XmlBars.getbar
方法有关,该方法不再返回子Bar元素

我在
org.glassfish.jaxb:jaxb运行时
和最新的Moxy上都尝试过,它们表现出相同的行为

JUnit5测试中显示了一个失败的示例:

package.com公司;
导入org.junit.jupiter.api.Test;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBException;
导入javax.xml.bind.Unmarshaller;
导入java.io.StringReader;
导入java.util.List;
导入静态org.junit.jupiter.api.Assertions.assertEquals;
类XmlBarsTest{
私有静态最终字符串XML=“name1name2”;
@试验
public void反序列化XmlBars()引发JAXBEException{
StringReader=新的StringReader(XML);
JAXBContext context=JAXBContext.newInstance(XmlBars.class);
Unmarshaller Unmarshaller=context.createUnmarshaller();
XmlBars反序列化斑马=(XmlBars)解组器。解组器(读卡器);
列表栏=反序列化栏。getBars();
assertEquals(2,钢筋尺寸(),“缺失钢筋”);
}
}
支持类是XmlBars:

package.com公司;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.XmlTransient;
导入java.util.ArrayList;
导入java.util.List;
导入静态java.util.stream.Collectors.toList;
@XmlRootElement(name=“bar”)
公共类XmlBars{
@XmlTransient
私人酒吧名单;
公共酒吧(){
bars=新的ArrayList();
}
公共XmlBars(列表栏){
这个。巴=巴;
}
@xmlement(name=“Bar”)
公共列表getbar(){
返回条==null?
无效的:
bar.stream()
.map(XmlBar::新建)
.collect(toList());
}
公共无效挫折(列表){
this.bar=list.stream()
.map(XmlBar::getBar)
.collect(toList());
}
}
XmlBar:

package.com公司;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlTransient;
公共类XmlBar{
@XmlTransient
私人酒吧;
公共XmlBar(){
bar=新的bar();
}
公共XmlBar(Bar){
这个.bar=bar;
}
Bar getBar(){
返回杆;
}
@xmlement(name=“name”)
公共字符串getName(){
返回bar.getName();
}
公共void集合名(字符串名){
bar.setName(名称);
}
}
和酒吧:

package.com公司;
公共类酒吧{
私有字符串名称;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
以及一个支持pom.xml的文件:


4.0.0
com公司
测试
1.0-快照
javax.xml.bind
jaxb api
2.3.1
com.sun.xml.bind
jaxb impl
2.2.7
org.junit.jupiter
JUnitJupiter api
5.4.0
测试
org.junit.jupiter
朱尼特木星发动机
5.4.0
测试
org.apache.maven.plugins
maven编译器插件
3.8.0
1.8
1.8
真的
真的
org.apache.maven.plugins
maven surefire插件
3.0.0-M3
更新 如果我将
XmlBars
修改为以下内容,它将起作用:

package.com公司;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.XmlTransient;
导入java.util.ArrayList;
导入java.util.List;
导入静态java.util.stream.Collectors.toList;
@XmlRootElement(name=“bar”)
公共类XmlBars{
@XmlTransient
私人酒吧名单;
/*添加此项可以使注释像以前一样工作*/
私人酒吧;
公共酒吧(){
bars=新的ArrayList();
xmlBars=newarraylist();
}
公共XmlBars(列表栏){
这个。巴=巴;
this.xmlBars=bar.stream()
.map(XmlBar::新建)
.collect(toList());
}
@xmlement(name=“Bar”)
公共列表getbar(){
返回条;
}
公共无效挫折(列表){
this.bar=list.stream()
.map(XmlBar::getBar)
.collect(toList());
this.xmlBars=列表;
}
}

所以,问题是,我如何注释原始版本以防止需要维护本地属性?

我们找不到解决方案。因此,我们修改了类,使其具有具有常规getter和setter的属性