Resteasy(JBoss AS 6)验证

Resteasy(JBoss AS 6)验证,jboss,resteasy,jboss6.x,Jboss,Resteasy,Jboss6.x,我正在寻找一种为Resteasy服务提供自定义输入验证的好模式 假设我有这项服务: @Local @Path("/example") public interface IExample { public Response doSomething ( @QueryParam("arg1") String arg1, @QueryParam("arg2") Integer arg2); } 我已经实施了: @Stateless public class Example implements I

我正在寻找一种为Resteasy服务提供自定义输入验证的好模式

假设我有这项服务:

@Local
@Path("/example")
public interface IExample {
  public Response doSomething ( @QueryParam("arg1") String arg1, @QueryParam("arg2") Integer arg2);
}
我已经实施了:

@Stateless
public class Example implements IExample {
  @Override
  public Response doSomething ( String arg1, Integer arg2 ) { ... }
}
验证arg1和arg2的最佳实践是什么

我的想法是:

  • 验证内部剂量测量法(…)方法。缺点:当我将来添加一些参数(例如arg3)时,我很容易忘记验证它
  • 在自定义javax.servlet.Filter中。缺点:我无法访问arg1和arg2,因为它们还没有被Resteasy框架解析
  • 我提出了这个概念:

    public class ExampleValidator implements IExample {
      public static class ValidationError extends RuntimeException { ... }
    
      @Override 
      public Response doSomething ( String arg1, Integer arg2 ) {
         // here do validation. In case of failure, throw ValidationError
         return null;
      }
    }
    
    可按如下方式使用:

    @Stateless
    public class Example implements IExample {
      @Override
      public Response doSomething ( String arg1, Integer arg2 ) {
         try { 
           (new ExampleValidator()).doSomething(arg1, arg2); 
         } catch ( ValidationError e ) {
            // return Response with 400
         }
      }
    }
    
    这样,当我更改IExample.doSomething方法签名时,由于编译时错误,我必须更新验证器。为了使Resteasy不将ExampleValidator解释为服务,我使用了Resteasy.jndi.resources而不是Resteasy.scan,但它失败了(在Resteasy尝试在部署时使用它之后加载了示例bean)

    有什么想法吗?有什么好的验证模式吗? 还是有可能以某种方式让我的概念发挥作用

    编辑:或者,Resteasy中有一些过滤器对应项,哪一个最好?在实际实现之前调用我的方法(过滤器),但参数(arg1,arg2)已经解析的方案

    提前感谢,很抱歉发了这么长的帖子;) Kamil(1)最干净的方法可能是使用JavaEE6bean验证框架。这需要编写自定义验证拦截器。在这种情况下,您必须更改方法,因此

    public Response doSomething ( String arg1, Integer arg2 )
    
    您可以使用域对象作为参数

    public Response doSomething ( JAXBElement<MyDomainObject> myOJaxb )
    
    但这适用于路径参数,而不是查询参数(我想,但没有检查JAX-RS规范)

    您的选择取决于界面的灵活性和时间

    如果您能提出一个类似于选项(3)中建议的通用、可插入到Resteasy的解决方案,并在GitHub上实现开源,许多人会喜欢您:)

    @Path("users/{username: [a-zA-Z][a-zA-Z_0-9]}")