2017-02-15 13 views
2

我有一個dropwizard 1.0.6應用程序。我希望把所有JAX-RS和驗證上的註釋的接口上,然後註冊我的資源來實現這個接口,類似於:當在接口中的JAX-RS驗證消息

@Path("/user") 
@Produces(MediaType.APPLICATION_JSON) 
public interface UserEndpoint { 
    @POST 
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
    Response createUser(
     @FormParam("username") @NotEmpty @Email String username, 
     @FormParam("password") @Size(min=4) String password); 
} 

和resepective資源:

public class UserResource implements UserEndpoint { 
    public Response createUser(String username, String password) { 
     //my logic here 
    } 
} 

這工作令人驚訝,除了在錯誤響應的驗證消息,這已成爲:

createUser.arg0 not a well-formed email address

,而我會指望他們是:

form field username not a well-formed email address

UPDATE:

如果我直接添加了JAX-RS和驗證註釋UserResource,則驗證消息是我所期望的:它報告的參數的名稱如@FormParam註釋中所述。這是我想要實現的,但在界面中有註釋。

+0

所以,當你不使用的接口獲取所需要的信息呢? –

+0

是的,確切地說。我希望的消息是如果我不使用接口並且所有註釋都在資源上的消息。 – JChrist

回答

1

參數的真實名稱在運行時不適用於JVM,因此它被替換爲arg0,爲了解決此問題,您將必須處理ParameterNameProvider這將使用反射來返回字符串列表getParameterNames(Method yourExceptionImpl)

+0

如果我在資源本身上有註釋,那麼驗證消息將使用相應'@ XXXParam'註釋中的名稱,在我的示例中爲'@ FormParam'。我想知道爲什麼在界面上註釋時不起作用。我會更新我的問題以反映這一點。 – JChrist

+0

這就是爲什麼規範說要始終重複註釋的依靠繼承的 –

3

註釋不會被繼承,除非它們使用@Inherited進行註釋。 每Java Language Specification

註釋繼承只適用於類(而不是方法,接口或構造函數)

所以它是由想要使用的註釋是否會檢查父代碼類/界面用於註釋。

換句話說,你需要將有助於Dropwizard,使其從父類搜索註釋/接口