2013-06-12 23 views
0

我得到了錯誤http://jira.codehaus.org/browse/JACKSON-288,但它表示應該在版本1.6.2中修復該錯誤。@XmlJavaTypeAdapter不起作用

我指的是大量的線程,像,
Jersey JSON and Date
How to convert Date(ActionScript 3) to java.util.Date through a xml?

我試過版本1.12,1.14,1.17.1,都不會在我身邊的作品。

@XmlRootElement(name="info") 
@XmlAccessorType(XmlAccessType.NONE) 
public class InfoVO { 
    private int infoId; 
    @XmlElement 
    @XmlJavaTypeAdapter(DateAdapter.class) 
    private Date createTime; 
//...get/set 

} 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import javax.ws.rs.WebApplicationException; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class DateAdapter extends XmlAdapter<String, Date> { 

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

    @Override 
    public String marshal(Date v) { 
     return dateFormat.format(v); 
    } 

    @Override 
    public Date unmarshal(String v) { 
     try { 
      return dateFormat.parse(v); 
     } catch (ParseException e) { 
      throw new WebApplicationException(); 
     } 
    } 
} 


    <dependency> 
     <groupId>javax.annotation</groupId> 
     <artifactId>jsr250-api</artifactId> 
     <version>1.0</version> 
    </dependency> 

但該DateAdapter不能被調用,並得到了一個例外,

2013年6月12日11:11:13.363:警告::/XA /信息/保存/ 12121 :org.codehaus.jackson.map.JsonMappingException:無法從String值構造java.util.Date的實例'2013-06-08 08:00:00':不是有效的表示(錯誤:無法解析日期「2013 -06-08 08:00:00「:與任何標準格式不兼容(」yyyy-MM-dd'T'HH:mm:ss.SSSZ「,」yyyy-MM-dd'T'HH:mm: ss.SSS'Z'「,」EEE,dd MMM yyyy HH:mm:ss zzz「,」yyyy-MM-dd「))| at [Source:[email protected];行:8,柱:23](通過參考鏈:com.xchange.me.vo.InfoVO [ 「createTime」])

回答

0

我得到了根本原因,正如我加入定製化MessageBodyReader,

@Provider 
    @Consumes("application/json") 
    public class CustomJsonReader<T> implements MessageBodyReader<T> { 
     @Override 
     public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
      return true; 
     } 

    @Override 
    public T readFrom(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, 
      InputStream entityStream) throws IOException, WebApplicationException { 

     /* 
     * Copy the input stream to String. Do this however you like. Here I use 
     * Commons IOUtils. 
     */ 
     StringWriter writer = new StringWriter(); 
     IOUtils.copy(entityStream, writer, "UTF-8"); 
     String json = writer.toString(); 

     /* 
     * if the input stream is expected to be deserialized into a String, 
     * then just cast it 
     */ 
     if (String.class == genericType) 
      return type.cast(json); 

     /* 
     * Otherwise, deserialize the JSON into a POJO type. You can use 
     * whatever JSON library you want, here's a simply example using GSON. 
     */ 
     ObjectMapper objectMapper = new ObjectMapper(); 
     return objectMapper.readValue(json, type); 
    } 
    } 

所以當收到json數據時,總是進入readFrom方法,然後在線返回objectMapper.readValue(json,type);

所以我認爲,根本原因是ObjectMapper.readValue忽略註釋@XmlJavaTypeAdapter