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