更改Web service日期格式

项目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)
})

猜你喜欢

转载自zlhades.iteye.com/blog/1851391