Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不区分大小写的Jaxb2Marshaller_Java_Xml_Jaxb_Spring Batch_Case Insensitive - Fatal编程技术网

Java 不区分大小写的Jaxb2Marshaller

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

Jaxb2Marshaller()是Spring的O/X映射集成类的一部分

我将其用作
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);