0

我正在尝试使用此 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。

4

1 回答 1

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

于 2013-12-04T21:13:22.157 回答