簡體   English   中英

使用通用參數使用REST服務

[英]Consume REST service with generic parameter

我正在嘗試使用此REST服務

@POST
@Path(value="/storeGeneric")
@Consumes(MediaType.APPLICATION_JSON)
public <T> void storeGeneric(T data) {
    try {
        System.out.println("data name: "+data.getClass().getCanonicalName());
        ...
    } catch (Exception e) {
        e.printStackTrace();
    }
}

通過此javascript函數傳遞JSON對象:

function sendArticolo() {
    var articolo = {};
    articolo.id = 1;
    articolo.prezzo = 1;
    articolo.descrizione="roba";
    try {
        $.ajax({
            url: 'http://localhost:8080/ZZCrudRest/services/Rest/storeArticolo',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify(articolo),
            dataType: 'json'
        });
    } catch (err) {
        alert(err.message);
    }
}

但是,我得到了這個例外:

12:37:26,294 GRAVE [com.sun.jersey.spi.container.ContainerResponse] (http-127.0.0.1-127.0.0.1-8080-1) The RuntimeException could not be mapped to a response, re-thr
owing to the HTTP container: java.lang.ClassCastException: java.lang.reflect.Method cannot be cast to java.lang.Class
        at com.owlike.genson.reflect.TypeUtil.getTypes(TypeUtil.java:362) [genson-0.94.jar:]
        at com.owlike.genson.reflect.TypeUtil.match(TypeUtil.java:298) [genson-0.94.jar:]
        at com.owlike.genson.convert.BasicConvertersFactory.provide(BasicConvertersFactory.java:102) [genson-0.94.jar:]
        at com.owlike.genson.convert.BasicConvertersFactory.create(BasicConvertersFactory.java:74) [genson-0.94.jar:]
        at com.owlike.genson.convert.BasicConvertersFactory.create(BasicConvertersFactory.java:56) [genson-0.94.jar:]
(more and more...)

有沒有辦法使用JSON使用帶有通用參數的REST服務? 我用谷歌搜索了很多但沒有成功。 我正在使用Jersey 1.8,genson 0.94,jboss 7.1。

Genson不知道T的類型,因此無法正確反序列化它。 順便說一句,沒有辦法知道這里的類型(有或沒有genson)。 genson的解決方案是:

1)將簽名更改為:public void storeGeneric(Object data)

2)然后在客戶端的json(js代碼)中添加根對象的類型(假設您不希望反序列化為com.mypackage.FooBar,那么在json中您必須具有:{“ @class”:“ com.mypackage.FooBar“,...其余屬性...}

注意 :“ @class”:“ yourclass”必須是對象的第一個鍵/值對。

Genson將從那里獲取類型。

在服務器端,您必須通過執行以下操作在Genson中啟用對多態類型的支持:

@Provider
public class GensonCustomResolver implements ContextResolver<Genson> {
  // configure the Genson instance
  private final Genson genson = new Genson.Builder().setWithClassMetadata(true).create();

  @Override
  public Genson getContext(Class<?> type) {
      return genson;
  }
}

另外0.94已經很舊了,您應該升級到最新版本:0.98

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM