首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Resteasy (JBoss AS 6)验证

Resteasy (JBoss AS 6)验证
EN

Stack Overflow用户
提问于 2011-06-03 11:51:03
回答 1查看 1.1K关注 0票数 3

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

假设我有这样的服务:

代码语言:javascript
运行
复制
@Local
@Path("/example")
public interface IExample {
  public Response doSomething ( @QueryParam("arg1") String arg1, @QueryParam("arg2") Integer arg2);
}

我已经实现了:

代码语言:javascript
运行
复制
@Stateless
public class Example implements IExample {
  @Override
  public Response doSomething ( String arg1, Integer arg2 ) { ... }
}

验证arg1和arg2的最佳实践是什么?

我的想法:

  1. 在doSomething中验证(.)方法。缺点:当我添加一些参数时(例如。( arg3)将来,我很容易忘记验证它。
  2. 在自定义javax.servlet.Filter中。缺点:我不能在那里访问arg1和arg2,因为它们还没有被Resteasy框架解析。

我想出了一个概念:

代码语言:javascript
运行
复制
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;
  }
}

可用于以下方面:

代码语言:javascript
运行
复制
@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方法签名时,由于编译时错误,我必须更新Validator。为了避免Resteasy将ExampleValidator解释为服务,我使用了resteasy.jndi.resources而不是resteasy.scan,但是它失败了(例如,在resteasy尝试在部署时使用它之后加载bean )。

有什么想法--有什么好的验证模式吗?或者是否有可能让我的概念发挥作用?

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

事先谢谢,很抱歉写了很长的一篇文章;

EN

回答 1

Stack Overflow用户

发布于 2012-02-23 14:32:16

(1)最干净的方法可能是使用JavaEE6Bean验证框架。这需要编写自定义验证拦截器。在这种情况下,您必须更改您的方法,所以,而不是

代码语言:javascript
运行
复制
public Response doSomething ( String arg1, Integer arg2 )

您将使用域对象作为参数。

代码语言:javascript
运行
复制
public Response doSomething ( JAXBElement<MyDomainObject> myOJaxb )

然后,您需要转换请求,以便它们提供XML或JSON格式的数据,这些数据可以自动转换为实际对象。

(2)另一种选择是使用正常的ServletFilter。

(3)准备自定义注释a‘’la验证,然后需要插入自定义注释处理器(查看Lombok项目,作为一个灵感)。

(4)最简单的解决方案是使用内置的REST验证。

代码语言:javascript
运行
复制
@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]}")

但这适用于路径参数,而不是查询参数(我认为,但没有检查JAX-RS规范)。

您的选择取决于您对接口有多大的灵活性,以及您有多少时间。

如果您想出一个通用的、可插入的Resteasy解决方案,类似于选项(3)中的建议,并在GitHub上开放源代码,那么很多人都会喜欢你的:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6226747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档