gpt4 book ai didi

java - 使用通用参数使用 REST 服务

转载 作者:行者123 更新时间:2023-12-01 13:45:54 25 4
gpt4 key购买 nike

我正在尝试使用此 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 的解决方案是:

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

关于java - 使用通用参数使用 REST 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20378646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com