gpt4 book ai didi

java - 基于注释的 Spring bean 验证

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:41 26 4
gpt4 key购买 nike

我正在研究使用 spring modules 验证 Spring bean 的基于注解的方法.在 this tutorial ,以下bean(省略了getters和setters)作为示例:

public final class User {  

@NotBlank
@Length(max = 80)
private String name;

@NotBlank
@Email
@Length(max = 80)
private String email;

@NotBlank
@Length(max = 4000)
private String text;
}

如果不遵守特定的验证规则,则使用的错误消息应遵循以下格式:

bean-class.bean-propery[validation-rule]=Validation Error message

上面显示的类的示例包括:

User.email[not.blank]=Please enter your e-mail address.  
User.email[email]=Please enter a valid e-mail address.
User.email[length]=Please enter no more than {2} characters.

消息键包含类名的事实带来了几个问题:

  1. 如果重命名类,则消息键也需要更改
  2. 如果我有另一个类(例如 Person)具有与 User.email 相同验证的电子邮件属性,我需要复制消息,例如

    Person.email[not.blank]=请输入您的电子邮件地址。
    Person.email[email]=请输入有效的电子邮件地址。
    Person.email[length]=请输入不超过 {2} 个字符。

事实上,文档声称可以像这样为特定规则(例如@Email)配置默认消息:

email=email address is invalid

如果找不到规则的特定于 bean 的消息,则应使用此默认消息。但是,我的经验是这根本行不通。

避免重复消息的另一种机制是将错误消息的键传递给规则注释。例如,假设我为@Email 规则定义了以下默认错误消息

badEmail=Email address is invalid

如果我像这样注释相关属性,则应使用此消息:

@Email(errorCode="badEmail")
private String email;

但是我试了一遍又一遍,它似乎不起作用。在使用此验证框架时,有没有人找到避免重复错误消息的方法?

最佳答案

我快速浏览了 BeanValidator API ,看起来您可能想试试 errorCodeConverter 属性。

您需要实现自己的 ErrorCodeConverter ,或使用提供的实现之一?

....
<bean id="validator" class="org.springmodules.validation.bean.BeanValidator"
p:configurationLoader-ref="configurationLoader"
p:errorCodeConverter-ref="errorCodeConverter" />

<bean id="errorCodeConverter" class="contact.MyErrorCodeConverter" />
....

注意:configurationLoader 是教程中使用的配置 XML 中定义的另一个 bean

示例转换器:

package contact;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springmodules.validation.bean.converter.ErrorCodeConverter;

public class MyErrorCodeConverter implements ErrorCodeConverter {

private Log log = LogFactory.getLog(MyErrorCodeConverter.class);

@Override
public String convertPropertyErrorCode(String errorCode, Class clazz, String property) {
log.error(String.format("Property %s %s %s", errorCode, clazz.getClass().getName(), property));
return errorCode; // <------ use the errorCode only
}

@Override
public String convertGlobalErrorCode(String errorCode, Class clazz) {
log.error(String.format("Global %s %s", errorCode, clazz.getClass().getName()));
return errorCode;
}
}

现在属性应该起作用了:

MyEmailErrorCode=Bad email

class Foo {
@Email(errorCode="MyEmailErrorCode")
String email
}

关于java - 基于注释的 Spring bean 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/149506/

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