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