我正在维护一些复杂的Java代码,由于相当多的“缺少” Java对象,Castor(v1.2)的编组工作非常缓慢。可以看到,XML包含的字段超出了我的要求,但是Castor反复尝试实例化Java对象,从而导致许多ClassNotFound错误。
Castor映射文件:
<mapping>
<class name="com.example.imaging.product.Product">
<map-to xml="product"/>
<field name="productId" type="long">
<bind-xml name="id" node="attribute"/>
</field>
</class>
<class name="com.example.imaging.product.RegionConfiguration">
<map-to xml="mediaConfiguration"/>
<field name="name" type="string">
<bind-xml name="name" node="attribute"/>
</field>
<field name="design" type="int">
<bind-xml name="designId" node="attribute"/>
</field>
</class>
</mapping>
XML来源:
<?xml version="1.0"?>
<product id="1234">
<productImage colorId="1"/>
<mediaConfiguration name="Front" designId="98765" />
<color id="1" name="Red" default="true"/>
</product>
我的问题是
color
字段没有Java等效项,并且我不希望将其编组。我尝试在castor.properties文件中设置org.exolab.castor.xml.strictelements=false
,但这不能阻止它遍历类装入路径并引发ClassNotFound错误。如何使Castor跳过不需要的XML元素?
最佳答案
听起来您无法覆盖尝试解组每个元素的行为,请参见the Castor reference。您是否衡量了实际性能影响是什么?最好忽略这一点,直到Castor开发出更好的覆盖行为为止。
如果映射文件中未描述该类,则Castor将使用Java Reflection API对该类进行内部检查,以确定是否存在任何形式为getXxxYyy()/ setXxxYyy(x)的函数。该访问器将与名为“xxx-yyy”的XML元素/属性相关联。将来,我们将提供一种方法来覆盖此默认行为。