XStreamカスタム時間変換器(シンプル)

3832 ワード

XStreamカスタムコンバータは簡単で、xmlファイルからJavaBenに値を賦与する時の時間フィールドの値が「」というように、いくつかの個人化のニーズを満たすために主に使用されます。この場合、デフォルトの変換器はエラーとなり、カスタムの変換器が必要です。
 
     ブログを参考にしました
     http://www.jiucool.com/blog/xstream-custom-type-converter-converter/
    
     XMLファイルは以下の通りです
    
<Fault>
  <faultId>1</faultId>
  <deviceId>10023</deviceId>
  <deviceModel>10023</deviceModel>
  <processStat>1</processStat>
  <faultDesc>    </faultDesc>
  <process>    </process>
  <timeoutReason>    </timeoutReason>
  <timeout>1.25</timeout>
  <protime>1.24</protime>
  <faulttime></faulttime>
  <closetime>2014-03-04 </closetime>
</Fault>
 
    faulttimeはjava.util.Dateタイプで、値がないとNULLに戻ります。変換器は以下の通りです。
   
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.thoughtworks.xstream.converters.ConversionException;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;


public class MyDateConverter implements Converter {
	private String dateformatter= "yyyy-MM-dd HH:mm:ss";

	/**
	 *       
	 * 
	 * @author jiucool.com
	 */
	public MyDateConverter() {
		super();
		this.dateformatter = "yyyy-MM-dd HH:mm:ss";
	}

	public MyDateConverter(String dateformatter) {
		super();
		this.dateformatter = dateformatter;
	}

	@Override
	public boolean canConvert(Class clazz) {
		return Date.class.isAssignableFrom(clazz);
	}

	@Override
	public void marshal(Object value, HierarchicalStreamWriter writer,
			MarshallingContext context) {
		Date date = (Date) value;
		writer.setValue(format(this.dateformatter, date));
	}

	@Override
	public Object unmarshal(HierarchicalStreamReader reader,
			UnmarshallingContext context) {
		try {
			return parse(this.dateformatter, reader.getValue());
		} catch (ParseException e) {
			try {
				return parse("yyyy-MM-dd", reader.getValue());
			} catch (ParseException e1) {
				e1.printStackTrace();
			}
			throw new ConversionException(e.getMessage(), e);
		}
	}

	public static String format(String pattern, Date date) {
		if (date == null) {
			return "";
		} else {
			return new SimpleDateFormat(pattern).format(date);
		}
	}

	public static Date parse(String pattern, String text) throws ParseException {
		if(text==null||"".equals(text.trim())||"null".equals(text.trim().toLowerCase()))
		{
			return null;
		}
		SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
		return dateFormat.parse(text);
	}
}
 
    使用方法は:
   
 XStream xstream2 = new XStream(new DomDriver());
	   xstream2.registerConverter(new MyDateConverter());
	   xstream2.alias("Fault",Fault.class);
	   Fault fault2=(Fault) xstream2.fromXML(new File("f:/saveFile/tmp/fault2.xml"));
	   System.out.println(fault2);
 
    全文が終わる