我正在考虑公开一个接收未定义数量参数的jaxrs方法:
所以,我希望能够处理类似的事情:
public class Foo {
property1,
property2,
List<KeyValuePair> ...
}
public class KeyValuePair {
String key,
String value
}
然后,
@POST
public Response update(Foo document) {
for (KeyValuePair pair : document.pairs)
{
...
}
}
我不知道这个。 我很感激你的帮助。 谢谢大家。
答案 0 :(得分:2)
主要是JSON。我的JEE应用程序正在使用api库。实现取决于每个容器。实际上,我的容器是WildFly 8.2和GlassFish 4.1。
注意此解决方案仅适用于JSON。
处理此问题的一种方法是使用杰克逊的@JsonAnySetter
。您可以在Jackson tips: using @JsonAnyGetter/@JsonAnySetter to create "dyna beans"了解更多相关信息。例如
@Path("json")
public class JsonResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response post(Model model) {
return Response.ok(model).build();
}
public static class Model {
public String name;
private Map<String, Object> otherProps = new HashMap<>();
@JsonAnySetter
public void anyProps(String key, Object value) {
otherProps.put(key, value);
}
@JsonAnyGetter
public Map<String, Object> otherProps() {
return otherProps;
}
}
}
Model
上不是name
的所有属性都会放入otherProps
地图中。这是由@JsonAnySetter
注释引起的。 @JsonAnyGetter
只是为了确保属性被编组。
要使用此功能,我建议使用它的最便携方式是添加此依赖项
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.4.0</version>
</dependency>
Glassfish没有这个,所以它不会与任何东西发生冲突。你唯一需要做的就是禁用默认的反序列化器(MOXy;相信我,无论如何你都要这样做 - 杰克逊更好地工作)。要以便携方式禁用MOXy,请设置属性。所以在你的Application
课程中,你可以拥有
@ApplicationPath("/api")
public class JaxrsApplication extends Application {
@Override
public Map<String, Object> getProperties() {
Map<String, Object> properties = new HashMap<>();
properties.put("jersey.config.disableMoxyJson", true);
return properties;
}
}
这只是一个软依赖,意味着不需要使用该属性的类。它只是一个字符串。它不会影响您尝试使用它的任何其他容器。因此您可以将属性留给任何容器,即使它只是严格影响Glassfish。
在Wildfly中,你真的不需要做任何其他事情。我要说的唯一“困难”是,如果您移植到Wildfly,您应该将上面的Jackson依赖项更改为provided
<scope>
。 Wildfly实际上已经在引擎盖下使用了这种依赖。为了不与它的版本冲突,我们可以简单地将其标记为<scope>provided</scope>
。我们无法使用Glassfish执行此操作,因为我们需要将jar包含到构建中。