gpt4 book ai didi

java - Spring 验证错误生成

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:10 25 4
gpt4 key购买 nike

我正在使用 JSR-303 和 Spring MVC 3 进行验证。验证是通过 validator.validate(bean, errors) 手动完成的。在 Controller 中。

我注释了 name Foo 的属性(property)用@NotNull上课.当验证失败时,我注意到 Spring MVC 在 Errors 中生成了以下错误代码对象。

NotNull.form.foo.name
NotNull.name
NotNull.java.lang.String
NotNull

<form:errors>的方式标记的工作原理是它将遍历所有错误代码并查找默认资源包,直到返回非空消息为止。有没有办法自定义这些错误代码或至少自定义它们列出的顺序?

原因是我有一个自定义ResourceBundle如果在资源包文本文件中找不到消息,则返回从给定消息代码派生的默认消息的对象。因为标记在错误代码列表中向下工作,所以它将查找 NotNull.form.foo.name首先在这个例子中。文本文件当然没有此条目,因此自定义 ResourceBundle 对象将返回默认消息。问题是,我已经在文本文件中为 NotNull 定义了一条消息,但标签会按原样看到。

如果我能以某种方式只生成一个错误代码,或者颠倒错误代码的顺序,它就会起作用。

有什么想法吗?谢谢。

最佳答案

找不到比这个更简单的解决方案...

my-servlet.xml

<bean id="handlerAdapter" class="org.opensource.web.StandardAnnotationMethodHandlerAdapter">
</bean>

StandardAnnotationMethodHandlerAdapter.java

public class StandardAnnotationMethodHandlerAdapter extends AnnotationMethodHandlerAdapter    {
@Override
protected ServletRequestDataBinder createBinder(HttpServletRequest request, Object target, String objectName) throws Exception {
MyServletRequestDataBinder dataBinder = new MyServletRequestDataBinder(target, objectName);
return dataBinder;
}
}

MyServletRequestDataBinder.java

public class MyServletRequestDataBinder extends ServletRequestDataBinder {

private MessageCodesResolver messageCodesResolver = new MyMessageCodesResolver();

@Override
public void initBeanPropertyAccess() {
super.initBeanPropertyAccess();
BindingResult bindingResult = super.getBindingResult();
if(bindingResult instanceof AbstractBindingResult) {
((AbstractBindingResult)bindingResult).setMessageCodesResolver(messageCodesResolver);
}
}

@Override
public void initDirectFieldAccess() {
super.initDirectFieldAccess();
BindingResult bindingResult = super.getBindingResult();
if(bindingResult instanceof AbstractBindingResult) {
((AbstractBindingResult)bindingResult).setMessageCodesResolver(messageCodesResolver);
}
}
}

MyMessageCodesResolver.java

public class MyMessageCodesResolver extends DefaultMessageCodesResolver {

public static final String NOT_NULL_ERROR_CODE = "NotNull";

@Override
public String[] resolveMessageCodes(String errorCode, String objectName, String field, Class fieldType) {
if(NOT_NULL_ERROR_CODE.equalsIgnoreCase(errorCode)) {
String notNullErrorCode = errorCode + CODE_SEPARATOR + objectName + CODE_SEPARATOR + field;
//notNullErrorCode = postProcessMessageCode(notNullErrorCode);
return new String[] {notNullErrorCode};
}
return super.resolveMessageCodes(errorCode, objectName, field, fieldType);
}
}

关于java - Spring 验证错误生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4219740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com