2012-12-08 56 views
1

默認情況下,哪些API(jars)jersey用於生成json。 示例:Jersey客戶端無法反序列化json服務 - 異常(無法反序列化實例)

{ 
     "kategorijaartikla": [ 
      { 
       "id": "1", 
       "kategorija": "kategorija1" 
      }, 
      { 
       "id": "2", 
       "kategorija": "kategorija2" 
      } 
     ] 
    } 

使用Array是否更好?我認爲解析起來比較容易。你怎麼看? 例如:

[ 
     { 
      "id": "1", 
      "kategorija": "kategorija1" 
     }, 
     { 
      "id": "2", 
      "kategorija": "kategorija2" 
     } 
    ] 

我JSON球衣服務:

@GET 
@Produces("application/json") 
    public List<kategorijaartikla> GetSveKategorije(){ 


     return KategorijaArtiklaDAO.getInstance().getAll(); 
    } 

還有就是我kategorijaartikla.java

我使用EJB anotation爲Hibernate映射和JAXB的反序列化和序列化JSON。

kategorijaartikla.java

@Entity 
@XmlRootElement 
public class kategorijaartikla { 
    /** @pdOid f9032734-7d05-4867-8275-bf10813c3748 */ 
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String kategorija; 

    public kategorijaartikla() { 
     // TODO Add your own initialization code here. 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer newId) { 
     this.id = newId; 
    } 

    public String getKategorija() { 
     return kategorija; 
    } 

    public void setKategorija(String newKategorija) { 
     this.kategorija = newKategorija; 
    } 
} 

有我的球衣客戶端代碼:

ClientConfig clientConfig = new DefaultClientConfig(); 
     clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, 
       Boolean.TRUE); 
     Client client = Client.create(clientConfig); 
     WebResource r = client 
       .resource("http://tomcat.fit.ba/asdf/rest/GetAllKategorije"); 

     List<kategorijaartikla> output = r.get(new GenericType<List<kategorijaartikla>>() {}); 

     System.out.println("Output from Server .... \n"); 
     System.out.println(output.size()); 

後呼叫服務,我有例外:

Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 
at [Source: [email protected]64; line: 1, column: 1] 
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:564) 
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:524) 
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:696) 
    at com.sun.jersey.api.client.WebResource.get(WebResource.java:196) 
    at com.fit.test.Json.GetAllKategorijeJson.main(GetAllKategorijeJson.java:34) 
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 
at [Source: [email protected]64; line: 1, column: 1] 
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219) 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212) 
    at org.codehaus.jackson.map.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:246) 
    at org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:204) 
    at org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:194) 
    at org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:30) 
    at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2695) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1308) 
    at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419) 
    at com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.readFrom(JacksonProviderProxy.java:139) 
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:554) 
    ... 4 more 

回答

1

諾貝特,slusaj ...我有一樣的問題。 我正在構建一個簡單的Restful服務,並且當GET方法執行得相當好時,JAXB從JaxB註釋的POJO類中返回JSON。當我的方法是@Consuming JSON(POST,PUT案例)時,我發現JAXB在那裏存在一些問題。

當構建Jersey/JSON服務時,最好使用JACKSON代替JaxB註釋(您會發現很多關於它的搜索結果)。問題是JAXB不能很好地將JSON轉換(反序列化)到POJO對象。 JAXB及其@XMLRootElement在使用XML時非常合適,但不適用於JSON。

這是我已經在web.xml中啓用JSON傑克遜的反序列化/序列化:

<!-- JAXB works great with XML but with JSON it's much better to use Jackson. Jersey will use Jackson --> 
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 

谷歌的.jar文件需要被列入澤西使用傑克遜... 祝你好運...

+0

:Driješiosam ovo davno。我忘了發佈一個解決方案,類似於你的,需要把這個到** web.xml **' ​​com.sun.jersey.config.property.packages com.myservis; org.codehaus.jackson .jaxrs '謝謝你的回答。 pozzzz :) –