Java 覆盖DropWizard ConstraintViolation消息

Java 覆盖DropWizard ConstraintViolation消息,java,jax-rs,dropwizard,Java,Jax Rs,Dropwizard,因此,我想更改用于通过DropWizard资源验证模型的验证消息 我正在使用JavaBean验证注释。例如,下面是我要验证的字段之一: @NotEmpty(message = "Password must not be empty.") 我可以使用一个验证器来测试它是否正常工作 但是,当我使用DropWizard对资源进行验证时,它会向该消息添加一些额外的内容。我看到的是-密码不能为空。(为空)我在这里找到了执行此操作的代码- 特别是这种方法- public static <T>

因此,我想更改用于通过DropWizard资源验证模型的验证消息

我正在使用JavaBean验证注释。例如,下面是我要验证的字段之一:

@NotEmpty(message = "Password must not be empty.")
我可以使用一个验证器来测试它是否正常工作

但是,当我使用DropWizard对资源进行验证时,它会向该消息添加一些额外的内容。我看到的是-
密码不能为空。(为空)
我在这里找到了执行此操作的代码-

特别是这种方法-

public static <T> String format(ConstraintViolation<T> v) {
    if (v.getConstraintDescriptor().getAnnotation() instanceof ValidationMethod) {
        final ImmutableList<Path.Node> nodes = ImmutableList.copyOf(v.getPropertyPath());
        final ImmutableList<Path.Node> usefulNodes = nodes.subList(0, nodes.size() - 1);
        final String msg = v.getMessage().startsWith(".") ? "%s%s" : "%s %s";
        return String.format(msg,
                             Joiner.on('.').join(usefulNodes),
                             v.getMessage()).trim();
    } else {
        return String.format("%s %s (was %s)",
                             v.getPropertyPath(),
                             v.getMessage(),
                             v.getInvalidValue());
    }
}
公共静态字符串格式(ConstraintViolation v){
if(v.getConstraintDescriptor().getAnnotation()实例验证方法){
final ImmutableList节点=ImmutableList.copyOf(v.getPropertyPath());
final ImmutableList usefulNodes=nodes.subList(0,nodes.size()-1);
最后一个字符串msg=v.getMessage().startsWith(“.”?“%s%s”:“%s%s”;
返回String.format(msg,
Joiner.on('.').join(usefulNodes),
v、 getMessage()).trim();
}否则{
返回字符串.格式(“%s%s(是%s)”,
v、 getPropertyPath(),
v、 getMessage(),
v、 getInvalidValue());
}
}
我有什么办法可以改变这种行为吗?我只想显示我在注释中设置的消息…

就是使用该方法的消息。为了覆盖它,您需要注销它并注册您自己的

删除异常映射程序

将以下内容添加到yaml文件中。请注意,它将删除dropwizard添加的所有默认异常映射器

server:
    registerDefaultExceptionMappers: false

创建并添加您自己的异常映射程序

public class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

    @Override
    public Response toResponse(ConstraintViolationException exception) {
        // get the violation errors and return the response you want.
    }
}

以下是dropwizard 0.8中的编程解决方案:

public void run(final MyConfiguration config, final Environment env) {
    AbstractServerFactory sf = (AbstractServerFactory) config.getServerFactory();
    // disable all default exception mappers
    sf.setRegisterDefaultExceptionMappers(false);
    // register your own ConstraintViolationException mapper
    env.jersey().register(MyConstraintViolationExceptionMapper.class)
    // restore other default exception mappers
    env.jersey().register(new LoggingExceptionMapper<Throwable>() {});
    env.jersey().register(new JsonProcessingExceptionMapper());
    env.jersey().register(new EarlyEofExceptionMapper());
} 
public void运行(最终MyConfiguration配置,最终环境环境){
AbstractServerFactory sf=(AbstractServerFactory)config.getServerFactory();
//禁用所有默认异常映射程序
sf.SetRegisterDefaultExceptionAppers(假);
//注册您自己的ConstraintViolationException映射程序
env.jersey().register(MyConstraintViolationExceptionMapper.class)
//还原其他默认异常映射程序
env.jersey().register(新LoggingExceptionMapper(){});
env.jersey().register(new-jsonprocessingexceptionapper());
env.jersey().register(new EarlyEofExceptionMapper());
} 

我认为它比配置文件更可靠。正如您所看到的,它还支持所有其他方法。

@ValidationMethod在这里应该很有用。不是吗


我更喜欢,因为他重新安装了此答案的第一步删除的其他异常映射器,实际上只更改了
ConstraintValidationException
s的映射器。这应该是可接受的答案,因为当前的映射器删除的异常映射器比OP要求的多。
public void run(T configuration, Environment environment) throws Exception {
  environment.jersey().register(ConstraintViolationExceptionMapper.class);
}
public void run(final MyConfiguration config, final Environment env) {
    AbstractServerFactory sf = (AbstractServerFactory) config.getServerFactory();
    // disable all default exception mappers
    sf.setRegisterDefaultExceptionMappers(false);
    // register your own ConstraintViolationException mapper
    env.jersey().register(MyConstraintViolationExceptionMapper.class)
    // restore other default exception mappers
    env.jersey().register(new LoggingExceptionMapper<Throwable>() {});
    env.jersey().register(new JsonProcessingExceptionMapper());
    env.jersey().register(new EarlyEofExceptionMapper());
} 
@ValidationMethod(message="Password cannot be empty")
@JsonIgnore
public boolean isPasswordProvided() {
    return false if password not provided;
}