当前位置: 首页 > 知识库问答 >
问题:

在Spring启动验证中使用 messages.properties 文件的自定义验证消息中的问题

孙明德
2023-03-14

我正在使用Spring验证来验证Rest Controller输入,如果有人能告诉我是否有可能在异常情况下抛出自定义消息,并且自定义消息应来自属性文件,我将不胜感激。

用户控制器.java

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(
        value="/",
        method=RequestMethod.POST,
        consumes = MimeTypeUtils.APPLICATION_JSON_VALUE,
        produces = MimeTypeUtils.APPLICATION_JSON_VALUE
)
public Object[] createUser(@ModelAttribute("user") User user, BindingResult bindingResult) {
    new UserValidator().validate(user,bindingResult);
    if (bindingResult.hasErrors()) {
        return  bindingResult.getFieldErrors().toArray();
    }
}

用户验证程序.java

public class UserValidator implements Validator{

@Override
public boolean supports(Class<?> aClass) {
    return User.class.equals(aClass);
}

@Override
public void validate(Object obj, Errors errors) {
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "user.firstName.empty");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "user.lastName.empty");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "slug", "user.slug.empty");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "user.email.empty");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "user.password.empty");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "phone", "user.phone.empty");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "address", "user.address.empty");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "country", "user.country.empty");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "gender", "user.gender.empty");

    User user = (User) obj;
    Pattern pattern = Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", 
    Pattern.CASE_INSENSITIVE);
    if(!errors.hasErrors()) {
        if (!(pattern.matcher(user.getEmail()).matches())) {
            errors.rejectValue("email", "user.email.invalid");
        }
    }
}
}

消息.属性

# messages.properties
user.firstName.empty=Enter a valid first name.
user.lastName.empty = Enter a valid last name.
user.slug.empty = Select gender.
user.phone.empty = Select gender.
user.address.empty = Select gender.
user.country.empty = Select gender.
user.password.empty = Select gender.
user.gender.empty = Select gender. 
user.email.empty = Enter a valid email.
user.email.invalid = Invalid email! Please enter valid email.

自定义消息源配置.java

@Configuration
public class CustomMessageSourceConfiguration {
@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new 
ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

@Bean
public LocalValidatorFactoryBean getValidator() {
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    bean.setValidationMessageSource(messageSource());
    return bean;
}
}

浏览器响应

 {codes: ["user.firstName.empty.user.firstName", "user.firstName.empty.firstName",…], arguments: 
null,…} 
codes: ["user.firstName.empty.user.firstName", "user.firstName.empty.firstName",…]
0: "user.firstName.empty.user.firstName"
1: "user.firstName.empty.firstName"
2: "user.firstName.empty.java.lang.String"
3: "user.firstName.empty"
arguments: null
defaultMessage: null
objectName: "user"
field: "firstName"
rejectedValue: null
bindingFailure: false
code: "user.firstName.empty"

共有3个答案

洪哲彦
2023-03-14

验证方式

我们可以创建单独的 bean 验证。

用户.java

@Entity
@Table(name = "users")
public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

   @NotNull
   @InBetweenNumberCustom(min = 12,max = 18)
   private Integer age;

   //getters and setters 
}

这里我们将创建@InBetweenNumberCustom验证注释。

import com.something.validator.ConstraintValidator.InBetweenNumberValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, 
ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(InBetweenNumberCustom.List.class)
@Documented
@Constraint(validatedBy = {InBetweenNumberValidator.class})
public @interface InBetweenNumberCustom {

String message() default "Must be in between {min} and {max}";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

int min() default 0;

int max() default 2147483647;

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, 
ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented

public @interface List {
    InBetweenNumberCustom[] value();
}
}

InBetweenNumberValidator.java

import com.something.validator.annonations.InBetweenNumberCustom;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class InBetweenNumberValidator implements 
ConstraintValidator<InBetweenNumberCustom,Integer> {
private int minValue;
private int maxValue;

@Override
public void initialize(InBetweenNumberCustom inBetweenNumberCustom) {
    this.minValue = inBetweenNumberCustom.min();
    this.maxValue = inBetweenNumberCustom.max();
}

@Override
public boolean isValid(Integer aInteger, ConstraintValidatorContext 
constraintValidatorContext) {
    // null values are not valid
    if ( aInteger == null ) return false;
    else return aInteger <= this.maxValue && aInteger >= this.minValue;
}
}

用户控制器.java

public JSONObject createUser(@Validated @RequestBody User user, 
BindingResult bindingResult) {
...
...
}
林修真
2023-03-14

另一种验证方式

我们可以自动将MessageSource连接到UserController。在CustomMessageSourceConfiguration中配置的java。java来获取消息。属性文件。

@Autowired
private MessageSource messageSource;

public  User  createUser(@Valid @ModelAttribute("user") @RequestBody User 
user) {
   final ArrayList errorList = new ArrayList<>() {};
    bindingResult.getFieldErrors().forEach(fieldError -> {
        errorList.add(new 
  ObjectError(fieldError.getField(),messageSource.getMessage(fieldError.getCode(), 
  null, Locale.getDefault())));
    });

现在,我们从messages.properties文件中获得所需的错误消息映射。

濮阳祯
2023-03-14

另一种验证方式

我们可以添加第四个参数作为错误消息而不使用messages.properties文件

public class UserValidator implements Validator{

@Override
public boolean supports(Class<?> aClass) {
return User.class.equals(aClass);
}

@Override
public void validate(Object obj, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", 
"user.firstName.empty","Error Message Here");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", 
"user.lastName.empty","Error Message Here");
...
... 
}
}
 类似资料:
  • 问题内容: 我在这里尝试了答案中的步骤:HibernateValidator,自定义ResourceBundleLocator和Spring 但是仍然只是作为输出而不是消息。 dispatcher-servlet.xml /WEB-INF/validationMessages.properties: 表格(上课地点) 这是怎么了 问题答案: 得到它了!:-) 我在我的计算机中添加了以下bean而不

  • 我正在创建一个简单的Spring REST应用程序,下面是我的Spring配置类; 这就是我在控制器类中所做的; 我已经在EmployeeModel中注释了我的姓名字段,如下所示; 这是我的messages.properties文件,在src/main/资源文件夹中。 但我无法读取此错误消息,我只收到@NotEmpty的默认消息。 我甚至尝试了以下配置; 请帮我拿这个!

  • 我正在将Laravel-5.8与Vue一起使用。js。我的问题是如何在Vee Validate库中显示规则的自定义错误消息。“required”规则的自定义消息没有显示,而是显示为:“first_name字段是必需的。”预期的消息是“请输入名字。” 下面的代码在应用程序中。js 这是我的HTML组件代码。 下面是我的JS脚本代码 我遗漏了什么吗?

  • 我正在尝试在laravel中编写用于验证的自定义消息。我在网上查过,看到一些帖子,其他人通过添加一个受保护的函数来解决同样的问题。我还向代码中添加了该函数,但它不起作用。这是我的代码这是myFormController.php: 公共函数请求(注册请求$request){$validated=$request- 这是RegistrationRequest.php: 使用Illumb\Contrac

  • 我使用的是jboss KeyCloak1.5最终版本。我开发了与keycloak属性和我的用户企业数据库接口的自定义用户联邦提供程序。 我的需要是发送到用户登录界面自定义的错误消息,基于特定的特定错误与我的遗留用户数据库。

  • 我正在尝试编写一个自定义bean验证器,并根据用户界面上的语言环境显示验证消息。 为此,我创建了一个验证器,如下所示: 我还注册了messageSource和validator bean: 在我的控制器中,我使用initBinder注册我的验证器: 不过,验证错误消息在用户界面上显示为{myproject.myclass.validation.name}。即使我设置了LocalValidatorF