由于项目需要和其他公司合作开发,所以需要XML来作为传输数据格式。
感觉DOM SAX JAXP 用起来过于复杂,就选择了Castor这个框架,在使用过程中碰到了一些问题记录一下。
1: Castor 和 Spring 整合
<bean id="resolver" class="org.castor.spring.xml.CastorResolverFactoryBean">
<property name="mappingLocations">
<list>
<value>mapping.xml</value>
</list>
</property>
</bean>
定义从xml 组装成 java 对象 bean
<bean id="unmarshaller" class="org.castor.spring.xml.CastorUnmarshallerFactoryBean">
<property name="resolver">
<ref local="resolver" />
</property>
</bean>
定义从java 对象 组装成 xml bean
<bean id="marshaller" class="org.castor.spring.xml.CastorMarshallerFactoryBean">
<property name="resolver">
<ref local="resolver" />
</property>
</bean>
代码调用
DATA data=new DATA();
data.setGatewayId(1L);
data.setNodeId(1L);
data.setTime(new Date());
data.setFRQ(2.00f);
StringWriter writer=new StringWriter();
marshaller.setWriter(writer);
marshaller.marshal(data) ;
2: 有一些特殊的字段比如时间格式 需要自定义 fileHandler
public class TimeHandlerImpl extends GeneralizedFieldHandler {
public final DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Object convertUponGet(Object value) {
if(value==null)
return null;
Date date = (Date) value;
return format.format(date);
}
@Override
public Object convertUponSet(Object value) {
if(value==null)
return null;
String dateStr = (String) value;
try {
return format.parse(dateStr);
}
catch (ParseException e) {
throw new RuntimeException(e);
}
}
@Override
public Class getFieldType() {
return Date.class;
}
}
mapping.xml 当中定义时间格式字段
<field name="time" type="string" handler="xxxx.TimeHandlerImpl">
<bind-xml name="time" node="element" />
</field>
参考:1 http://www.castor.org/1.2/xml-mapping.html#Sample-1:-Defining-a-custom-field-handler
2 http://www.ibm.com/developerworks/cn/xml/x-bindcastor/