【发布时间】:2015-04-17 23:19:59
【问题描述】:
我想做一个非常具体的任务,获取Object 中每个字段的所有验证消息。
第一个任务很简单,在Object 中获取所有Annotations 字段,同样递归,已经完成。
(百里香的html5val方言修改代码)
private List<Annotation> fieldAnnotations() {
Field field = this.fieldFinder.findField(this.targetClass, this.targetFieldName);
if (field != null) {
List<Annotation> annotations = Arrays.asList(field.getAnnotations());
List<Annotation> toAdd = new ArrayList<>();
for(Annotation a:annotations)
if(a.annotationType().isAssignableFrom(Valid.class)){
toAdd.addAll(new AnnotationExtractor(field.getType()).getAnnotationsForField(this.targetFieldName));
}
else
toAdd.add(a);
return toAdd;
}
return Collections.emptyList();
}
现在我正在尝试通过国际化获取每个注释的消息。
BeanPropertyBindingResult binding = new BeanPropertyBindingResult(realObject, root);
for (Annotation constraint : constraints) {
String message = AnnotationExtractor.getDefaultMessage(constraint);
binding.rejectValue(fieldName, constraint.annotationType().getSimpleName(), message);
}
List<ObjectError> errors = binding.getAllErrors();
RequestContext requestContext = (RequestContext) arguments.getContext().getVariables().get(SpringContextVariableNames.SPRING_REQUEST_CONTEXT);
for(ObjectError e:errors){
String s =requestContext.getMessage(e, true);
}
我收到了国际化消息,如果 MessageSource 可以解决问题,那就太好了!
可悲的是,我无法获取默认消息的消息,例如org.hibernate.validator.constraints.Length.message,但这不是问题(我总是可以通过我的MessageSource 提供这些消息)。
为了使这项任务充分发挥作用,我想念一件事,即消息的参数。因此,已解决的消息如下所示。
Alias length must be between {2} and {1}。 BeanPropertyBindingResult 有一种方法可以拒绝带参数的值,但我不知道如何从 Annotation 中获取它。应该是Validator实现的吧?
这与 Spring DataBinder 对无效字段所做的工作相同,但我想在 HTML5 表单验证中为自定义验证消息获取此消息。有谁知道如何通过 Spring 内部使用对象推送 bean 以获取这些消息?
还有一件重要的事情,一切都在 thymeleaf 上下文中(这是我对 html5val 方言的修改)
【问题讨论】:
标签: java spring bean-validation thymeleaf