Rest 如何在打服务电话之前进行初步检查?

Rest 如何在打服务电话之前进行初步检查?,rest,jersey,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> <p

我正在使用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>
介绍 这里有一个非常适合您的用例的简单解决方案。我在这里展示的不是如何在调用服务之前执行操作,而是在调用服务之后以及在执行资源方法的代码之前执行操作。不过,从你对问题的描述来看,这似乎是一件好事

您可以创建自己的参数类,以便对表单输入执行任何操作(解析字符串、验证等)。只要确保您有一个接受
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>
然后,在资源类中,注入参数:

@POST
public Response postData(@FormParam("hiddenParam") MyParameter hidden){
   //use getters on "hidden" to extract some data if needed
}
请注意,您不必执行任何操作来隐藏此方法的代码中的
。您可以在参数类的代码中以透明的方式执行所有验证。这些检查不必一次又一次地重复,它们不会污染您的资源类

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


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

谢谢Tom,我有20个服务类,我需要在每个服务类中使用这个postData方法吗???@PreethiJain
postData
只是一个例子,名称可以是您喜欢的任何名称,使用
@GET
注释而不是
@POST
都没有问题。可以在已有的方法中使用参数类
@QueryParam
@PathParam
@FormParam
与e
GET
配合得很好。请记住在查询字符串、路径或表单数据中嵌入参数值。@PreethiJain这里有一篇关于这种方法的更深入的文章:感谢Tom的实例响应,我是否需要修改我的20个服务类???@PreethiJain否,
Response
只是一个允许您指定附加信息的类,例如HTTP状态码、媒体类型头、语言、cookie等。Jersey提供了一个简洁、易于使用的生成器。与其返回
字符串
,我更愿意将其包装在
响应中
以添加一些元数据,但这完全取决于您。它不会以任何方式影响参数类的使用。
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
}