我正在尋找一種爲Resteasy服務提供自定義驗證輸入的好模式。Resteasy(JBoss AS 6)驗證
比方說,我有這樣的服務:
@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的最佳做法?
我的想法:
- 驗證裏面的doSomething(...)方法。缺點:在將來添加一些參數(例如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方法簽名,我必須由於編譯時錯誤而更新Validator。爲了使Resteasy NOT TO將ExampleValidator解釋爲服務,我使用了resteasy.jndi.resources而不是resteasy.scan,但它失敗(示例bean在resteasy嘗試在部署時使用它之後加載)。
任何想法 - 是否有任何良好的驗證模式? 還是有可能以某種方式讓我的概念發揮作用?
編輯:或者,這將是最好的,Resteasy中有一些Filter對應物?在實際實現之前我的方法(Filter)會被調用,但參數(arg1,arg2)已被解析的一些方案?
由於提前,遺憾的冗長的交) 卡米爾