- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个把我难住了。我有一个 Java String Batch 应用程序,在 Java 1.8.0.77 上运行时没有任何错误。它读取 XML 文件并将其完美地写入数据库。
更新到 JDK 1.8.0.162 后,即使将日志记录设置为 DEBUG,阅读器也无法工作,也不会发送任何错误消息。改回 Java 1.8.0.77 可以解决该问题。不过我们的服务器运行的是 162,所以我必须在 162 上进行这项工作。
这是读者:
@Bean
ItemReader<Product> reviewItemReader() {
StaxEventItemReader<Product> xmlFileReader = new StaxEventItemReader<>();
xmlFileReader.setResource(new FileSystemResource(this.fileName));
xmlFileReader.setFragmentRootElementName("Product");
Jaxb2Marshaller feedMarshaller = new Jaxb2Marshaller();
feedMarshaller.setClassesToBeBound(Product.class);
xmlFileReader.setUnmarshaller(feedMarshaller);
return xmlFileReader;
}
当我针对 Java 1.0.8.77 运行它时,我获得了完整的产品记录,并且所有子类都用文件中的数据填充。当我针对 Java 1.0.8.162 运行它时,我只取回产品标签上的 3 个属性,而没有取回其中的任何字段。
XML 看起来像:
...
<Product id="asdsada" removed="false" disabled="true">
<Descriptoin> Blah blah blah</Descriptoin>
<UPCs>
<UPC> 123423432</UPC>
</UPCs>
<Rating>5</Rating>
<Name>name here</Name>
<Categories>
<Category> Cat 1 </Category>
<Category> Cat 2 </Category>
<Category> Cat 3 </Category>
</Categories>
...
</Product>
<Product id="zxcvzxcvxcv" removed="true" disabled="false">
<Descriptoin> Blah blah blah</Descriptoin>
<UPCs>
<UPC> 123222423432</UPC>
</UPCs>
<Rating>5</Rating>
<Name>name here</Name>
<Categories>
<Category> Cat 1 </Category>
<Category> Cat 2 </Category>
<Category> Cat 3 </Category>
</Categories>
....
</Product>
产品类别是这样的
@XmlRootElement(name = "Product", namespace = "FOO POWER")
public class Product {
@XmlAttribute(name = "removed")
public String removed;
@XmlAttribute(name = "disabled")
public String disabled;
@XmlAttribute(name = "id")
public String id;
public String Name;
public String Rating;
public UPCs UPCs;
public Brand Brand;
...
同样,它在 1.8.0.77 中运行完全没有任何问题。我在测试中通过它运行了数百万条记录。在 1.8.0.162 中运行时,这些相同的记录会失败
Someone asked to see what a child class looks like. They are pretty much like this:
public class Brand {
public String Name;
public Attributes Attributes;
public String ExternalId;
public String disabled;
...
最佳答案
今年早些时候我遇到了类似的问题。我正在将一个项目从 Java 1.8.0_92 升级到 1.8.0_152,并且一些适用于 1.8.0_92 的 JAXB 解码不再适用于 1.8.0_152。我在下面的回答中更多地作为实验结果而不是作为对文档的引用,因为我一直在努力寻找相关文档来支持我的发现。如果其他人可以找到相关文档,我很有兴趣查看。
我的理解是,如果 Java 类中的字段或属性没有 @XmlElement
注释,JAXB 会将该字段或属性视为具有注释 @XmlElement(name = "fieldName")
或 @XmlElement(name = "propertyName")
(视情况而定)。因此,例如,Product
类中未注释的字段将按如下方式处理:
@XmlElement(name = "Name")
public String Name;
@XmlElement(name = "Rating")
public String Rating;
@XmlElement(name = "UPCs")
public UPCs UPCs;
@XmlElement(name = "Brand")
public Brand Brand;
此外,在 Java 8 更新 101 和 111 之间,JAXB 中处理命名空间的方式发生了变化。 Java 8 更新 101 允许元素单独匹配本地名称,而不管命名空间,但从更新 111 开始,元素命名空间也必须匹配。如果您不指定命名空间(特别是,如果您根本不指定 @XmlElement
注释),则假定使用默认命名空间。
Product
元素的子元素不在默认命名空间中,因此它们不再与上面的 @XmlElement
注释匹配。但是,例如,尝试将 xmlns=""
添加到 Rating
元素。您应该会发现该产品的评级已被读入。
因此,解决您的问题的一种可能的解决方案是向所有子元素添加 @XmlElement
注释(包括命名空间)。这就是我需要做的来解决我遇到的问题:我已经有了必要的 @XmlElement
注释,我只需要向这样的注释添加一个命名空间。但是,我怀疑您有更多的子元素,并且您指定的示例文档是从更大的真实文档中截取的。考虑到这一点,创建带有相关注释的 package-info.java
文件并将其放入包含 POJO 的包中可能会更快(希望它们都在同一个包中) ):
@XmlSchema(
namespace = "FOO POWER",
elementFormDefault = XmlNsForm.QUALIFIED)
package your.package.name.here;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
我将其添加到我创建的一个小型 Java 项目中来测试您的代码,我发现解码似乎有效。 Product
类中的子属性使用 XML 文档中的值进行填充。我从 this page 中得到了使用 package-info.java
文件的想法。 .
关于java - 从 JDK 1.8.0.77 升级到 1.8.0.162 后 Jaxb2Marshaller 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49885939/
在编程环境中是哪一个?有区别吗?我已经看到了这两种方式,我不想在我的代码中拼错它。 最佳答案 编码(marshal)是工作图 block ;例如,消防编码(marshal)或美国编码(marshal)
我有以下结构: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct WAVEHDR { in
我找不到以下问题的明确答案:如果一个 COM 类是线程安全的,即它被标记为 Both 或 Free,我真的需要编码它的对象接口(interface)以将它传递给另一个线程吗?相同的过程?我不问两个线程
在编译 C# ASP.NET 应用程序时,我从 Visual Studio 2008 中收到奇怪的警告。谁能告诉我这个警告的含义(如果可能的话,用几个音节的词)? At least one of th
TL;DR:MongoDB 驱动程序是否提供了编码和解码文档单个字段的功能? 这是一个非常简单的问题,但这里有一些上下文: 我有一个工作人员负责在 2 个独立的数据库之间同步数据。当它接收到事件消息时
是否可以在使用自定义编码(marshal)拆收器的结构上使用 Marshal.SizeOf()? 例如: struct Abcde { public int test1; [MarshalAs
我有一张 map :[]map[string]string . 将结果填充到 json.marshal()兼容的对象。输出: [ { "key1": "val1", "key2":
如何在没有根元素的情况下进行编码(marshal)? type Ids struct { Id []string `xml:"id"` } IdsStr, _ := xml.Marshal(&Id
我有这个 C++ 代码: extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo) { *foo =
我创建了 map[string]interface{} 并且我想通过 2 个重置服务之间的映射传递多种类型。 每次我编码时,我都会在应该包含 reflect.Type 的字段中得到空映射。 Servi
我有一个托管的 .Net 类,它创建了我需要确保正确清理的非托管资源。 我有一个顺序结构: [StructLayout(LayoutKind.Sequential)] struct FooBar {
我在用 val akkaV = "2.2.3" val sprayV = "1.2.0" Seq( "io.spray" % "spray-can" % spra
我正在使用 Castor 编码/取消编码我的 Java 对象,其中一个对象包含一个 EnumMap。Castor 可以编码(marshal)/解封 EnumMaps 吗?我有一个带有一些嵌套 Hash
错误:com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException:无法编码类型类 [Ljava.lang.Strin
我们在 netbeans 中做了一次 cleanbuild,检查了 jdk 版本并在服务器上部署了所有内容,但仍然出现以下错误。有人可以帮忙吗? javax.servlet.ServletExcept
我想知道是否可以对我的类进行注释,以便编码器第一次遇到对象时,它会生成适当类型的 XML 元素,但任何其他对该对象的后续引用都将具有 XML IDREF条目已创建? 最佳答案 您可以利用 JAXB 的
我正在从现有代码构建一个通用类库,但我收到了一些编译器警告,提示我终其一生都不知道该如何处理。 我有这样的代码: void SomeMethod(Object data) { var size =
我在编码我的 JAXBElement 时遇到了这个异常,它有几个子元素。我如何弄清楚如何查明导致此异常的子元素? java.lang.NullPointerException at com.s
本文整理了Java中org.apache.poi.openxml4j.opc.internal.marshallers.ZipPartMarshaller.marshall()方法的一些代码示例,展示
我最近已经问了一个有关 JAXB 的问题,可以在以下位置找到:How to marshal/unmarshal Java objects with private fields using JAXB
我是一名优秀的程序员,十分优秀!