JavaSpring批处理应用程序上下文中的XStream双下划线处理
我正在使用XStream for oxm(Java对象到xml)。NameCoder使用下划线作为默认转义字符(更多信息见下文),由于我将ext_数据作为xml标记,因此它将被写入ext_数据 XStream将Java类名和字段名映射到XML标记或属性。不幸的是,这种映射不能是1:1,因为Java中用于标识符的某些字符在XML名称中无效。因此,XStream使用XmlFriendlyNameCoder将这些字符替换为替换字符。默认情况下,此名称编码程序使用下划线作为转义字符,因此也必须转义下划线本身。您可以提供不同配置的XmlFriendlyNameCoder实例,或者提供完全不同的实现,如NoNameCoder,以完全防止名称编码。但是,您有责任确保生成的名称对XML有效。() 我试图提供一个不同配置的XMLFriendlyNameCoder实例(使用HierarchycalStreamDriver的各种实现)以及一个完全不同的NoNameCoder实现。虽然应用程序运行成功,但结果保持不变。我正在使用XStream 1.4.8 有很多关于如何使用建议的解决方法的例子(这里有几个),所以我很有信心我的各种尝试都设置正确(但我可能忽略了一些东西)。以下是我最近的配置:JavaSpring批处理应用程序上下文中的XStream双下划线处理,java,spring,spring-batch,xstream,double-underscore,Java,Spring,Spring Batch,Xstream,Double Underscore,我正在使用XStream for oxm(Java对象到xml)。NameCoder使用下划线作为默认转义字符(更多信息见下文),由于我将ext_数据作为xml标记,因此它将被写入ext_数据 XStream将Java类名和字段名映射到XML标记或属性。不幸的是,这种映射不能是1:1,因为Java中用于标识符的某些字符在XML名称中无效。因此,XStream使用XmlFriendlyNameCoder将这些字符替换为替换字符。默认情况下,此名称编码程序使用下划线作为转义字符,因此也必须转义下划
<beans:bean id="myMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
<beans:property name="streamDriver">
<beans:bean class="com.thoughtworks.xstream.io.xml.Xpp3Driver">
<beans:constructor-arg>
<beans:bean class="com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder">
<beans:constructor-arg index="0" value="DDD"/>
<beans:constructor-arg index="1" value="_"/>
</beans:bean>
</beans:constructor-arg>
</beans:bean>
</beans:property>
<beans:property name="fieldAliases">
<util:map id="aliases">
<beans:entry key="com.billup.beans.Data.extData" value="ext_data"/>
</util:map>
</beans:property>
</beans:bean>
<beans:bean id="myMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
<beans:property name="streamDriver">
<beans:bean class="com.thoughtworks.xstream.io.xml.DomDriver">
<beans:constructor-arg value="UTF-8"/>
<beans:constructor-arg>
<beans:bean class="com.thoughtworks.xstream.io.naming.NoNameCoder"/>
</beans:constructor-arg>
</beans:bean>
</beans:property>
<beans:property name="fieldAliases">
<util:map id="aliases">
<beans:entry key="com.billup.beans.Data.extData" value="ext_data"/>
</util:map>
</beans:property>
</beans:bean>
我意识到这个问题看起来很独特,范围也很窄,但回答可能会揭示一个更大的问题,即如何在应用程序上下文中正确配置streamDriver(在Spring批处理应用程序中)
注意-我使用的是Spring4和Java8
谢谢
编辑:
我还尝试使用以下配置:
<beans:bean id="myMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
<beans:property name="streamDriver">
<beans:bean class="com.thoughtworks.xstream.io.xml.Xpp3Driver">
<beans:constructor-arg>
<beans:bean class="com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder">
<beans:constructor-arg index="0" value="DDD"/>
<beans:constructor-arg index="1" value="_"/>
</beans:bean>
</beans:constructor-arg>
</beans:bean>
</beans:property>
<beans:property name="fieldAliases">
<util:map id="aliases">
<beans:entry key="com.billup.beans.Data.extData" value="ext_data"/>
</util:map>
</beans:property>
</beans:bean>
<beans:bean id="myMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
<beans:property name="streamDriver">
<beans:bean class="com.thoughtworks.xstream.io.xml.DomDriver">
<beans:constructor-arg value="UTF-8"/>
<beans:constructor-arg>
<beans:bean class="com.thoughtworks.xstream.io.naming.NoNameCoder"/>
</beans:constructor-arg>
</beans:bean>
</beans:property>
<beans:property name="fieldAliases">
<util:map id="aliases">
<beans:entry key="com.billup.beans.Data.extData" value="ext_data"/>
</util:map>
</beans:property>
</beans:bean>
很明显,我做得不对。以下各项似乎正在发挥作用:
<beans:bean id="myMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
<beans:property name="nameCoder">
<beans:bean class="com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder">
<beans:constructor-arg index="0" value="_-"/>
<beans:constructor-arg index="1" value="_"/>
</beans:bean>
</beans:property>
<beans:property name="fieldAliases">
<util:map id="aliases">
<beans:entry key="com.billup.beans.Data.extData" value="ext_data"/>
</util:map>
</beans:property>
</beans:bean>