我正在使用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";
}
}
答案 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
注释一起使用。