2017-02-15 50 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, который будет использовать отражение, чтобы вернуть список String от getParameterNames(Method yourExceptionImpl)

+0

Если бы у меня были аннотации на самом ресурсе, тогда сообщения проверки будут использовать имя из соответствующей аннотации '@ XXXParam', в моем случае' @ FormParam'. Мне было интересно, почему это не работает, когда аннотации находятся на интерфейсе. Я буду обновлять свой вопрос, чтобы отразить это. – JChrist

+0

Вот почему спецификация говорит, что всегда лучше повторять аннотацию, полагаясь на унаследованные –

3

Аннотации не наследуются, если они не аннотируются @Inherited. Per аннотаций наследования Java Language Specification

работает только на классах (не методы, интерфейсы, или конструкторы)

Так это до кода, который хочет использовать аннотации, если она будет проверять родителей класс/интерфейс для аннотаций.

Другими словами, вам нужно будет внести свой вклад в Dropwizard, чтобы сделать его поиск аннотаций из родительских классов/интерфейсов

 Смежные вопросы

  • Нет связанных вопросов^_^