1

JSON応答:

{
    "categories": [{
            "id": "1",
            "category": "category1"
        },
        {
            "id": "2",
            "category": "category2"
        }
    ]
}

JSONジャージーサービス:

@GET
@Produces("application/json")
public List<Categories> GetAllCategories() {
    return CategoriesDAO.getInstance().getAll();
}

休止状態のマッピングにはEJBアノテーションを使用し、JSONの逆シリアル化とシリアル化にはjaxBを使用しています。

モデル:

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

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

    public Integer getId() {
        return id;
    }

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

    public String getCategory() {
        return category;
    }

    public void setCategory(String newCategory) {
        this.category = newCategory;
    }
} 

ジャージークライアントコード:

ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);
WebResource r = client.resource("http://tomcat.com/GetAllCategories");
List<Categories> output = r.get(new GenericType<List<Categories>>() {});
 

例外:

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: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@cc4364; 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: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@cc4364; 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
4

1 に答える 1

1

ブレート、スルサジ...私も同じ問題を抱えていました。私は単純なRestfulサービスを構築していて、GETメソッドが非常にうまく実行されたときに、JAXBがJaxB注釈付きPOJOクラスからJSONを返していました。私の方法が@ConsumingJSON(POST、PUTの場合)だったとき、JAXBにいくつかの問題があることがわかりました。

ジャージー/JSONサービスを構築するときは、JaxBアノテーション(グーグルについて多くのことがわかります)の代わりにJACKSONを使用することをお勧めします。問題は、JAXBがJSONからPOJOオブジェクトへの変換(逆シリアル化)をうまく行わないことです。@XMLRootElementを使用するJAXBは、JSONではなくXMLを操作する場合に非常に適しています。

これは、JacksonによるJSONの逆シリアル化/シリアル化を有効にするためにweb.xmlにあるものです。

<!--  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ファイルのGoogle...頑張ってください...

于 2012-12-15T20:11:51.213 に答える