gpt4 book ai didi

java - 将 java 从 1.8.0_77 更新到 1.8.0_121 后,JAXB 不会解码

转载 作者:行者123 更新时间:2023-11-30 07:56:48 25 4
gpt4 key购买 nike

昨天我像标题中那样更新了 java,现在 JAXB 不再解析 xml。所有对象都是空的,似乎没有任何设置。

鉴于此 POJO - ListMatchingProductsResponse

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ListMatchingProductsResponse", propOrder = {
"listMatchingProductsResult",
"responseMetadata"
})
@XmlRootElement(name = "ListMatchingProductsResponse")
public class ListMatchingProductsResponse {
@XmlElement(name = "ListMatchingProductsResult")
private ListMatchingProductsResult listMatchingProductsResult;
@XmlElement(name = "ResponseMetadata")
private ResponseMetadata responseMetadata;
@XmlAttribute(name = "xmlns")
private String xmlns;

public String getXmlns() {
return xmlns;
}

public void setXmlns(String xmlns) {
this.xmlns = xmlns;
}


/**
* Get the value of ListMatchingProductsResult.
*
* @return The value of ListMatchingProductsResult.
*/
public ListMatchingProductsResult getListMatchingProductsResult() {
return listMatchingProductsResult;
}

/**
* Set the value of ListMatchingProductsResult.
*
* @param listMatchingProductsResult The new value to set.
*/
public void setListMatchingProductsResult(ListMatchingProductsResult listMatchingProductsResult) {
this.listMatchingProductsResult = listMatchingProductsResult;
}

/**
* Get the value of ResponseMetadata.
*
* @return The value of ResponseMetadata.
*/
public ResponseMetadata getResponseMetadata() {
return responseMetadata;
}

/**
* Set the value of ResponseMetadata.
*
* @param responseMetadata The new value to set.
*/
public void setResponseMetadata(ResponseMetadata responseMetadata) {
this.responseMetadata = responseMetadata;
}
}

和 ListMatchingProductsResult

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="ListMatchingProductsResult", propOrder={
"products"
})
@XmlRootElement(name = "ListMatchingProductsResult")
public class ListMatchingProductsResult {

@XmlElement(name="Products")
private ProductList products;

/**
* Get the value of Products.
*
* @return The value of Products.
*/
public ProductList getProducts() {
return products;
}

/**
* Set the value of Products.
*
* @param products
* The new value to set.
*/
public void setProducts(ProductList products) {
this.products = products;
}

/**
* Check to see if Products is set.
*
* @return true if Products is set.
*/
public boolean isSetProducts() {
return products != null;
}


@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("products", products)
.toString();
}
}

我用它来解码:

String s = getResult();
// s is the expected xml string
ListMatchingProductsResponse m = JAXB.unmarshal(new StringReader(s), ListMatchingProductsResponse.class);
log.info(m); // ListMatchingProductsResponse@7164e54
log.info(m.getListMatchingProductsResult()); // null

我有点迷茫,因为我没有看到任何原因,也没有在变更日志中找到关于 JAXB 的任何变更。

我在这里做错了什么?

到目前为止,以下答案没有解决我的问题

JAXB Configuration was broken by upgrading from JDK 1.7 to JDK 1.8 u05 for collections

Unmarshalling jaxB doesn't work, objects null

Unmarshall with JAXB doesn't work

更新

我现在已经在我的项目中包含了以下依赖

group: 'org.jvnet.jaxb2.maven2', name: 'maven-jaxb2-plugin', version: '0.13.1'

它再次工作。那么新的问题 - 为什么会这样? 121 java 版本中是否缺少某些东西/错误?

最佳答案

我对此进行了编辑,事实证明 JRE 中的更改在技术上不是错误,但 1.8u91 和以前的版本更加宽松,并且允许无效的命名空间 XML,如果 xml 没有正确命名空间,1.8u101+ 会中断.

我在 GitHub 上创建了一个示例来说明差异。尝试使用 1.8u91 和 1.8u101+ 运行两个主要的 NoSchemaWithSchema 以查看行为差异。

在我的例子中,XML 不包含默认命名空间,但元素没有以它们所属的命名空间作为前缀 (broker.xml)。这在 1.8u91 中运行良好,但在 1.8u101 中失败。尽管升级破坏了我们的代码,但这在技术上不是 Oracle 的错,因为 XML 的命名空间不正确。

关于java - 将 java 从 1.8.0_77 更新到 1.8.0_121 后,JAXB 不会解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41850384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com