JAX-RS 2.0如何验证查询参数

  • 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

在JAX-RS 2.0规范中,要验证查询参数并不难,可以通过过滤器ContainerRequestFilter来实现。它还提供了一些可选项,例如使用CDI或EJB的拦截器,或通过@Context注解的HttpServletRequest进行注入。

使用场景:验证由调用者传递的查询参数

步骤:

  1. 实现过滤器
  2. 从ContainerRequestContext上下文中提取查询参数
  3. 执行验证——以适合的响应状态(和错误消息)中止请求
1. @Provider 
 @QueryParamValidator 
 public class JAXRSReqFilter implements ContainerRequestFilter { 
 @Override 
 public void filter(ContainerRequestContext requestContext) throws IOException { 
 MultivaluedMap < String, String > queryParameters = requestContext.getUriInfo().getQueryParameters(); 
 String queryParam = queryParameters.keySet().stream().findFirst().get(); 
 System.out.println(“Query param - ” + queryParam); 
 if (!queryParam.equals(“p”)) { 
 requestContext.abortWith(Response 
 .status(Response.Status.BAD_REQUEST) 
 .entity(“Invalid Query Param ” + queryParam) 
 .build()); 
 } 
 } 
 }
  1. 强制过滤器
  • 使用@NameBinding注解来修饰自定义的注解
  • 在JAX-RS的方法上使用自定义的注解
• @NameBinding 
 @Retention(RetentionPolicy.RUNTIME) 
 @Target({ElementType.TYPE, ElementType.METHOD}) 
 public @interface QueryParamValidator { 
 // do something 
 }
@Path(“test”) 
 public class TestResource { 
 @GET 
 @QueryParamValidator 
 public String test(@QueryParam(“p”) String p){ 
 return “Param “+ p + ” on ” + new Date(); 
 } 
 }