JAXRS 2.0 接收未定义数量的参数
JAXRS 2.0 Receive undefined number of parameters
我正在考虑公开一个接收未定义数量参数的 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)
{
...
}
}
我不知道要实现这个。
非常感谢你的帮助。
谢谢大家。
Mainly JSON. My JEE aplication is using api libraries.The implementation depends of each container. Actually, my containers are WildFly 8.2 and GlassFish 4.1.
注意此解决方案仅适用于JSON.
处理此问题的一种方法是使用 Jackson 的 @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;相信我,无论如何您都会想要这样做 - Jackson 只是 工作 更好)。要以便携方式禁用 MOXy,请设置 属性。所以在你的 Application
class 中,你可以
@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;
}
}
这只是一个软依赖,意味着不需要 classes 就可以使用 属性。它只是一个字符串。它不会影响您尝试在其中使用它的任何其他容器。因此您可以为任何容器保留 属性,即使它仅严格影响 Glassfish。
在 Wildfly 中,您真的不需要做任何其他事情。我唯一要说的 "hardship" 是,如果你移植到 Wildfly,你应该将上面的 Jackson 依赖项更改为 provided
<scope>
。 Wildfly 实际上已经在底层使用了这种依赖。为了不和它的版本冲突,我们可以简单的标记为<scope>provided</scope>
。我们无法使用 Glassfish 执行此操作,因为我们需要 将 jars 包含到构建中。
我正在考虑公开一个接收未定义数量参数的 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)
{
...
}
}
我不知道要实现这个。 非常感谢你的帮助。 谢谢大家。
Mainly JSON. My JEE aplication is using api libraries.The implementation depends of each container. Actually, my containers are WildFly 8.2 and GlassFish 4.1.
注意此解决方案仅适用于JSON.
处理此问题的一种方法是使用 Jackson 的 @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;相信我,无论如何您都会想要这样做 - Jackson 只是 工作 更好)。要以便携方式禁用 MOXy,请设置 属性。所以在你的 Application
class 中,你可以
@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;
}
}
这只是一个软依赖,意味着不需要 classes 就可以使用 属性。它只是一个字符串。它不会影响您尝试在其中使用它的任何其他容器。因此您可以为任何容器保留 属性,即使它仅严格影响 Glassfish。
在 Wildfly 中,您真的不需要做任何其他事情。我唯一要说的 "hardship" 是,如果你移植到 Wildfly,你应该将上面的 Jackson 依赖项更改为 provided
<scope>
。 Wildfly 实际上已经在底层使用了这种依赖。为了不和它的版本冲突,我们可以简单的标记为<scope>provided</scope>
。我们无法使用 Glassfish 执行此操作,因为我们需要 将 jars 包含到构建中。