2011-06-03 110 views
3

我正在尋找一種爲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的最佳做法?

我的想法:

  1. 驗證裏面的doSomething(...)方法。缺點:在將來添加一些參數(例如arg3)時,我很容易忘記驗證它。
  2. 在自定義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)已被解析的一些方案?

由於提前,遺憾的冗長的交) 卡米爾

回答

1

(1)可能是最清晰的方法是使用Java EE 6 Bean驗證框架。這將需要編寫自定義驗證攔截器。在這種情況下,你必須改變你的方法,所以不是

public Response doSomething (String arg1, Integer arg2) 

你會使用域對象作爲參數

public Response doSomething (JAXBElement<MyDomainObject> myOJaxb) 

然後,你需要trasform您的要求,所以他們提供XML或JSON格式化的數據,它可以自動轉換爲實際的對象。

(2)另一種選擇是使用普通的ServletFilter。 (3)準備自定義註釋a'la Bean Validation,然後你需要插入自定義註釋處理器(看看項目Lombok,作爲一個靈感)。

(4)最簡單的解決方案是使用內置的REST驗證

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

,但適用於路徑參數,而不是查詢參數(我想,但沒有與JAX-RS規範檢查)

您的選擇取決於您的界面有多少靈活性以及您擁有多少時間。

如果你想出一個通用的,可插拔的Resteasy解決方案,類似於選項(3)中的建議,並使其在GitHub上開源,許多人會愛你:)