项目QA开始用WSDL测试代码,每天一大堆的web service 的问题。
其中一个比较BT就是用SOAPUI测试,因为项目中本来默认的是yyyyMMdd,但webservice认的是yyyy-MM-dd.
每个方法写确认是不现实的,仔细再看一下,原来我的项目中转SOAP用的JAXB。那就好办了。实现XmlAdapter 就OK了。
帖代码,其实主要实现unmarshal 和 marshal方法。
private static SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
private static Pattern NUMBER_FORAMTER_PATTERN = Pattern.compile("\\d{8}");
private static final DatatypeFactory datatypeFactory;
static {
try {
datatypeFactory = DatatypeFactory.newInstance();
} catch (DatatypeConfigurationException e) {
throw new Error(e);
}
}
@Override
public Date unmarshal(String v) throws Exception {
if (StringUtils.isBlank(v) ) return null ;
String dateString = v.trim();
if( NUMBER_FORAMTER_PATTERN.matcher(dateString).matches() ) {
return yyyyMMdd.parse(dateString);
}
else {
return datatypeFactory.newXMLGregorianCalendar(dateString).toGregorianCalendar().getTime();
}
}
@Override
public String marshal(Date v) throws Exception {
if(v == null) return null;
Calendar cal = new GregorianCalendar(0,0,0);
cal.setTime(v);
return CalendarFormatter.doFormat("%Y-%M-%DT%h:%m:%s%z", cal);
}
还要加上一个包级别的annotation:
写个package-info.java,里面加包级相关的东西。
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters
({
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(type=java.util.Date.class, value=test.DateAdapter.class),
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(type=java.util.Calendar.class, value=test.CalendarAdapter.class)
})