我想让我的JaxRs资源获取一个自定义方法参数,该参数是根据请求中的某个参数构建的。
与从身体创建的另一个对象一起使用的东西。
类似的东西:
@Resource
public class MyResource {
@Path("/resource")
public Object resource(MyResourceDTO body, AConfiguration conf){
}
}
从请求中的某些标头创建AConfiguration
。
我怎样才能实现它?
我需要像春天webargumentresovler:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/support/WebArgumentResolver.html
这样的东西对于我的案例MyResource
是一个子资源,该方法在这种情况下也应该有效...
答案 0 :(得分:1)
如果添加DTO作为资源方法的参数,则JAX-RS运行时将尝试将请求的主体转换为此类型。您还可以添加任何@xParam
参数,例如@QueryParam
作为资源方法的参数。 (唯一的例外是@FormParam
因为它们存在于身体中)。
如果要将多个Params封装在一个对象中,可以使用@BeanParam。您的Configuration类可能如下所示:
public class Configuration {
@QueryParam("foo")
private String foo;
@HeaderParam("bar")
private String bar;
// getters + setters
}
可以像这样使用:
@POST
public Response someMethod(Dto dto, @BeanParam Configuration conf) {}
答案 1 :(得分:0)
您可以使用以下内容。您的conf
对象已从客户端发送为json
。如果conf
对象中的参数必须动态更改,则必须遵循第二种方法。
@Resource
public class MyResource {
@POST
@Consumes("application/json")
@Path("/resource")
public Object resource(AConfiguration conf){
// This method can receive multiple objects here. Currently it receives
// conf object only as the payload of the post method.
}
}
要动态更改conf对象,您可以发送json
String。
public Object resource(String confJson){
// Collect parameters manually here.
}
在pom.xml
中,您应该包括
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>2.3.1.GA</version>
</dependency>
修改强>
您可以将json字符串设置为标题参数(但不是最佳做法。)或者您可以设置不同的标题并使用HttpHeaders访问它们。 Here就是一个例子。
public Object resource(@Context HttpHeaders confHeaders){
// Collect parameters manually.
String confJson = confHeaders.getRequestHeader("confJson").get(0);
// cast your `confJson` to `AConfiguration aConf` here.
// process query params and set them to aConf here.
}