其中一个比较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) })