[JAVA] Dans Bean Validation, si vous souhaitez inclure le nom du champ dans le message d'erreur, vous ne pouvez pas sortir de LocalValidatorFactoryBean.

Aperçu

Si vous utilisez Bean Validation pour vérifier l'entrée et générer un message d'erreur, vous devez être prudent si vous souhaitez inclure le nom du champ dans le contenu, alors prenez note.

Environnement d'exécution

: star: Exemple de projet sur GitHub

Exemple

Si vous souhaitez afficher le message suivant dans le formulaire suivant

UserForm.java


import java.io.Serializable;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class UserForm implements Serializable {
	private static final long serialVersionUID = 1L;

	@NotNull(message = "{userForm.name}")
	@Size(min = 1, max = 20, message = "{userForm.name}")
	private String name;
	// getter/setter omis
"[name] is not null."

point important

UserControl.java


import javax.validation.Validator;

@Resource
private Validator validator;

//Partie de traitement réelle
Set<ConstraintViolation<UserForm>> violations = validator.validate(form);
if (!violations.isEmpty()) {
	for (ConstraintViolation<UserForm> v : violations) {
		log.info(v.getMessage());
	}
}

application-context.xml


<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

ValidationMessage.properties


userForm.name={0} is not null.

Je pensais que {0} serait remplacé par le nom du champ, mais le résultat de sortie réel est affiché sans être remplacé comme indiqué ci-dessous.

{0} is not null.

Raison

Autrement dit, utilisez @Validated comme suit

UserControl.java


@RequestMapping(value = "create", method = RequestMethod.POST, params = "confirm")
public String createConfirm(@Validated UserForm form, BindingResult result) {
	if (result.hasErrors()) {
		return "user/createForm";
	}
	return "user/createConfirm";
}

Ou utilisez Smart Validator

UserControl.java


import org.springframework.validation.SmartValidator;

@Resource //Validateur intelligent<mvc:annotation-driven>La définition de bean n'est pas requise car elle peut être utilisée si est définie.
private SmartValidator smartValidator;

@RequestMapping(value = "create", method = RequestMethod.POST, params = "confirm")
public String createConfirm(UserForm form, BindingResult result) {
	smartValidator.validate(form, result);
	if (result.hasErrors()) {
		return "user/createForm";
	}
	return "user/createConfirm";
}

Résumé

--LocalValidatorFactoryBean ne peut pas afficher le message d'erreur avec le nom du champ. --Parce qu'il est réalisé par la liaison de données Spring --Utilisez @Validated ou SmartValidator pour atteindre

Recommended Posts

Dans Bean Validation, si vous souhaitez inclure le nom du champ dans le message d'erreur, vous ne pouvez pas sortir de LocalValidatorFactoryBean.
Autoriser l'appel de valeurs arbitraires dans les messages d'erreur de validation de bean
Si vous souhaitez inclure la classe parente dans @builder de Lombok
Comment traduire le message d'erreur en japonais (que faire si vous ne pouvez pas vous connecter pour une raison quelconque)
Si vous utilisez DataSourceTransactionManager de Spring, il peut être validé en cas d'erreur! ??
Que faire si vous obtenez une erreur gcc dans Docker
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse