jax rs / resteasy自定义方法参数

时间:2014-09-04 08:15:00

标签: rest jax-rs resteasy

我想让我的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是一个子资源,该方法在这种情况下也应该有效...

2 个答案:

答案 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.
      }