如何在Jersey制作服务电话之前进行初步检查?

时间:2012-08-13 16:32:07

标签: rest jersey

我正在使用Jersey restful Web服务进行应用程序开发。

 <servlet>
   <servlet-name>Jersey Web Application</servlet-name>
   <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
   <init-param>
     <param-name>com.sun.jersey.config.property.packages</param-name>
     <param-value>com.services</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

我在com.services包下配置了一些服务类。

基本上我的要求是,在Jersey调用我的服务类之前,我想做一些初步检查。

基本上我的要求是在调用服务之前,我想检查是否存在从UI传递的输入隐藏变量。

那么可以扩展Jersey Framework来实现这个目标吗?

你能否告诉我如何在服务类中使用它?

@Path("/hello")
public class HelloService extends AbstractService {

    @GET
    @Produces("application/text")
    public String sayPlainTextHello() {


        return "Hello json";
    }

}

1 个答案:

答案 0 :(得分:1)

简介

这是一个非常适合您的用例的简单解决方案。我在这里展示的不是如何在调用服务之前执行操作,而是在调用服务之后立即执行并在资源代码之前执行方法被执行。不过,从你对这个问题的描述来看,这似乎是件好事。

您可以使用表单输入(解析字符串,验证等)创建自己的参数类来执行任何操作。只要确保你有一个带String参数的构造函数,你就可以将适当的对象注入资源类方法的调用中。如果值不正确,则抛出一个异常,指定Jersey返回客户端的消息和状态代码。

实施例

给出表格

<form action="http://example.com/rest/" method="post">
  <!-- some inputs -->
  <input type="hidden" name="hiddenParam" value="Some value you set on client side" />
</form>

创建一个像这样的参数类:

public class MyParameter{

  //some fields

  public MyParameter(String param){        
    //parse the string however you want, check if the value is correct
    if(param is correct){
      //set the fields 
    } else {
      throw new WebApplicationException(new InvalidArgumentException("Invalid parameter XYZ"), Response.Status.BAD_REQUEST);
    }
  }

  //some getters for fields
}

然后,在您的资源类中,注入参数:

@POST
public Response postData(@FormParam("hiddenParam") MyParameter hidden){
   //use getters on "hidden" to extract some data if needed
}

请注意,您不必在此方法的代码中对hidden执行任何操作。您可以在参数类的代码中以透明的方式执行所有验证。检查不必一遍又一遍地重复,它们不会污染您的资源类。

它还提供了一个易于测试的解决方案,通过使用通用参数类(更少的代码重复)可以使其更简单。

这些类也可以与@QueryParam@PathParam注释一起使用。