0

我正在使用 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 框架来实现这一点?

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

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

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


        return "Hello json";
    }

}
4

1 回答 1

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一起使用。

于 2012-08-13T17:07:55.613 回答