Проблема в пользовательском сообщении проверки с использованием файла messages.properties при проверке весенней загрузки

Я использую весеннюю проверку для проверки ввода Rest Controller, я был бы признателен, если кто-нибудь может сказать мне, есть ли возможность выдавать собственное сообщение в случае исключения, и это сообщение должно поступать из файла свойств.

UserController.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();
    }
}

UserValidator.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.

CustomMessageSourceConfiguration.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"

person Bijay Koirala    schedule 25.12.2019    source источник
comment
Я получил ответ: мы можем добавить 4-й параметр в ValidationUtils.rejectIfEmptyOrWhitespace (ошибки, firstName, user.firstName.empty, поле не может быть пустым); в UserValidator.java   -  person Bijay Koirala    schedule 29.12.2019


Ответы (3)


Другой способ проверки

Мы можем добавить 4-й параметр как сообщение об ошибке, не используя файл 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");
...
... 
}
}
person Bijay Koirala    schedule 29.12.2019

Другой способ проверки

Мы можем автоматически связать MessageSource с UserController.java, который настроен в CustomMessageSourceConfiguration.java для получения файла messages.properties.

@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.

person Bijay Koirala    schedule 29.12.2019

Способ проверки

Мы можем создать отдельную проверку компонентов.

Пользователи.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;
}
}

UserController.java

public JSONObject createUser(@Validated @RequestBody User user, 
BindingResult bindingResult) {
...
...
}
person Bijay Koirala    schedule 29.12.2019