Rest 如何在打服务电话之前进行初步检查?
我正在使用Jersey restful web服务进行应用程序开发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
<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方法吗???@PreethiJainpostData
只是一个例子,名称可以是您喜欢的任何名称,使用@GET
注释而不是@POST
都没有问题。可以在已有的方法中使用参数类@QueryParam
、@PathParam
和@FormParam
与eGET
配合得很好。请记住在查询字符串、路径或表单数据中嵌入参数值。@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
}