gpt4 book ai didi

java - 不区分大小写 Jaxb2Marshaller

转载 作者:行者123 更新时间:2023-11-30 03:09:19 26 4
gpt4 key购买 nike

Jaxb2Marshaller ( org.springframework.oxm.jaxb.Jaxb2Marshaller ) 是 Spring 的 O/X 映射集成类的一部分。

我使用它作为 StaxEventItemReader 的解码器:

<bean class="org.springframework.batch.item.xml.StaxEventItemReader">
<property name="marshaller">
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>xx.xx.xx.MyBean1</value>
<value>xx.xx.xx.MyBean2</value>
<value>xx.xx.xx.MyBean3</value>
</list>
</property>
</bean>
</property>
</bean>

MyBeanX 类使用 javax.xml.bind.annotation 注释进行注释:

@XmlRootElement(name="MyBean1")
@XmlType(propOrder = {"MyBean2", "MyBean2"})
public class MyBean1 implements Serializable {

private MyBean2 myBean2;
private MyBean3 myBean3;

@XmlElement(name="MyBean2")
public MyBean2 getMyBean2() {
return myBean2;
}

[...]
}

不幸的是,我需要解码的 XML 之间可能存在大小写差异:

<MYBEAN1>
<MYBEAN2></MYBEAN2>
<MYBEAN3></MYBEAN3>
</MYBEAN1>

<MyBean1>
<MyBean2></MyBean2>
<MyBean3></MyBean3>
</MyBean1>

<mybean1>
<mybean2></mybean2>
<mybean3></mybean3>
</mybean1>

或更多变体...

现在,我需要能够不区分大小写地解析这些 XML。到目前为止,我所看到的可能是创建一个 StreamReaderDelegate 并通过它传递 XMLStreamReader 将标签转换为小写或大写。

XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("file.xml"));
xsr = new MyStreamReaderDelegate(xsr);

其中 MyStreamReaderDelegate 看起来像这样:

private static class MyStreamReaderDelegate extends StreamReaderDelegate {

public MyStreamReaderDelegate(XMLStreamReader xsr) {
super(xsr);
}

@Override
public String getAttributeLocalName(int index) {
return super.getAttributeLocalName(index).toLowerCase();
}

@Override
public String getLocalName() {
return super.getLocalName().toLowerCase();
}

}

我的问题是我不知道要重写什么方法(以及在哪个类中)来通过此委托(delegate)传递 XML。查看 Jax2Marshaller 源代码,我发现 unmarshalStaxSource(Unmarshaller jaxbUnmarshaller, Source staxSource) 方法中使用了 XMLStreamReader :

private Object unmarshalStaxSource(Unmarshaller jaxbUnmarshaller, Source staxSource) throws JAXBException {
XMLStreamReader streamReader = StaxUtils.getXMLStreamReader(staxSource);
if (streamReader != null) {
return jaxbUnmarshaller.unmarshal(streamReader);
}
else {
XMLEventReader eventReader = StaxUtils.getXMLEventReader(staxSource);
if (eventReader != null) {
return jaxbUnmarshaller.unmarshal(eventReader);
}
else {
throw new IllegalArgumentException("StaxSource contains neither XMLStreamReader nor XMLEventReader");
}
}
}

所以我的问题是,如何重写此方法来添加委托(delegate)?

最佳答案

您可以使用 Moxy 2.6+ 版本来实现不区分大小写的编码。这是 link为特定目的而进行的特定增强。

您必须将 UNMARSHALLING_CASE_INSENSITIVE 属性设置为 true。这是一些示例代码

final StaxEventItemReader<ProductDTO> itemReader = new StaxEventItemReader<>();
final Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
final Map<String, Boolean> properties = Maps.newHashMap();
properties.put(UnmarshallerProperties.UNMARSHALLING_CASE_INSENSITIVE, Boolean.TRUE);
unMarshaller.setUnmarshallerProperties(properties);
itemReader.setUnmarshaller(unMarshaller);

关于java - 不区分大小写 Jaxb2Marshaller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33957817/

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