JAXRS 2.0接收未定义数量的参数

时间:2015-07-08 06:04:37

标签: java json jax-rs

我正在考虑公开一个接收未定义数量参数的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)
    {
        ...
    }
}

我不知道这个。 我很感激你的帮助。 谢谢大家。

1 个答案:

答案 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包含到构建中。