【问题标题】:JAX-RS validation messages when in interface界面中的 JAX-RS 验证消息
【发布时间】:2017-07-03 21:23:39
【问题描述】:

我有一个 dropwizard 1.0.6 应用程序。我想把所有的 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);
}

和相应的资源:

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

更新:

如果我将 JAX-RS 和验证注释直接添加到UserResource,那么验证消息就是我所期望的:它报告@FormParam 注释中指定的参数名称。这是我想要实现的,但在界面中有注释。

【问题讨论】:

  • 所以当您不使用界面时会收到所需的消息?
  • 是的,完全正确。我想要的消息是如果我不使用接口并且所有注释都在资源上的消息。

标签: java jersey jax-rs bean-validation dropwizard


【解决方案1】:

参数的真实名称在运行时对 JVM 不可用,因此它被替换为 arg0 ,为了解决这个问题,您必须处理 ParameterNameProvider ,它将使用反射来返回来自getParameterNames(Method yourExceptionImpl) 的字符串列表

【讨论】:

  • 如果我在资源本身上有注释,那么验证消息将使用相应 @XXXParam 注释中的名称,在我的情况下为 @FormParam。我想知道为什么当接口上有注释时这不起作用。我将更新我的问题以反映这一点。
  • 这就是为什么规范说总是重复注释更好地依赖于继承的注释
【解决方案2】:

注解不会被继承,除非它们使用@Inherited 进行注解。 根据Java Language Specification

注解继承仅适用于类(不适用于方法、接口或构造函数)

因此,如果要检查父类/接口是否有注释,则取决于要使用注释的代码。

换句话说,您需要为 Dropwizard 做出贡献,以使其从父类/接口中搜索注释

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2016-08-20
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多