当前位置: 代码迷 >> Web前端 >> 改动Web?service日期格式
  详细解决方案

改动Web?service日期格式

热度:151   发布时间:2013-04-26 16:27:53.0
更改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)
})

  相关解决方案