Java 不区分大小写的Jaxb2Marshaller
Jaxb2Marshaller()是Spring的O/X映射集成类的一部分 我将其用作Java 不区分大小写的Jaxb2Marshaller,java,xml,jaxb,spring-batch,case-insensitive,Java,Xml,Jaxb,Spring Batch,Case Insensitive,Jaxb2Marshaller()是Spring的O/X映射集成类的一部分 我将其用作statxeventitemreader的解组器: <bean class="org.springframework.batch.item.xml.StaxEventItemReader"> <property name="marshaller"> <bean class="org.springframework.oxm.jaxb.Jaxb2Marshall
statxeventitemreader
的解组器:
<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>
不幸的是,我需要解组的XML之间可能存在大小写差异:
<MYBEAN1>
<MYBEAN2></MYBEAN2>
<MYBEAN3></MYBEAN3>
</MYBEAN1>
<MyBean1>
<MyBean2></MyBean2>
<MyBean3></MyBean3>
</MyBean1>
<mybean1>
<mybean2></mybean2>
<mybean3></mybean3>
</mybean1>
其中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();
}
}
我的问题是我不知道要重写什么方法(以及在哪个类中)来通过这个委托传递我的XML。查看Jax2Marshaller
源代码,我发现XMLStreamReader
用于方法unmarshalStaxSource(Unmarshaller-jaxbUnmarshaller,source-statxsource)
:
因此,我的问题是,如何重写此方法以添加委托?您可以使用Moxy的2.6+版本来实现不区分大小写的编组。以下是针对特定目的进行的特定增强的一个示例 您必须将
解组\u不区分大小写
属性设置为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);
final statxeventitemreader itemReader=new statxeventitemreader();
final Jaxb2Marshaller unMarshaller=new Jaxb2Marshaller();
最终映射属性=Maps.newHashMap();
properties.put(UnmarshallerProperties.UNMARSHALLING_不区分大小写,Boolean.TRUE);
解组器。设置解组器属性(属性);
itemReader.setUnmarshaller(unMarshaller);
此解决方案仅适用于eclipselink。有没有一种通用的方法?例如,哪个示例也适用于ApacheWink?
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();
}
}
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");
}
}
}
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);