[JAVA] Wenn Sie in der Bean-Validierung den Feldnamen in die Fehlermeldung aufnehmen möchten, können Sie keine Ausgabe von LocalValidatorFactoryBean ausführen.

Überblick

Wenn Sie die Bean-Validierung verwenden, um die Eingabe zu überprüfen und eine Fehlermeldung auszugeben, müssen Sie vorsichtig sein, wenn Sie den Feldnamen in den Inhalt aufnehmen möchten. Notieren Sie sich dies.

Ausführungsumgebung

: star: Beispielprojekt ist auf GitHub

Beispiel

Wenn Sie die folgende Nachricht an das folgende Formular ausgeben möchten

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 weggelassen
"[name] is not null."

wichtiger Punkt

--Kann nicht mit LocalValidatorFactoryBean ausgegeben werden

UserControl.java


import javax.validation.Validator;

@Resource
private Validator validator;

//Tatsächlicher Verarbeitungsteil
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.

Ich dachte, dass {0} durch den Feldnamen ersetzt wird, aber das tatsächliche Ausgabeergebnis wird ausgegeben, ohne wie unten gezeigt ersetzt zu werden.

{0} is not null.

Grund

Verwenden Sie @Validated wie folgt

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";
}

Oder verwenden Sie Smart Validator

UserControl.java


import org.springframework.validation.SmartValidator;

@Resource //Smart Validator<mvc:annotation-driven>Die Bean-Definition ist nicht erforderlich, da sie verwendet werden kann, wenn sie festgelegt ist.
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";
}

Zusammenfassung

--LocalValidatorFactoryBean kann die Fehlermeldung einschließlich des Feldnamens nicht ausgeben.

Recommended Posts

Wenn Sie in der Bean-Validierung den Feldnamen in die Fehlermeldung aufnehmen möchten, können Sie keine Ausgabe von LocalValidatorFactoryBean ausführen.
Ermöglichen, dass beliebige Werte in Bean Validation-Fehlermeldungen aufgerufen werden
Wenn Sie die übergeordnete Klasse in Lomboks @builder aufnehmen möchten
So übersetzen Sie die Fehlermeldung ins Japanische (Was tun, wenn Sie sich aus irgendeinem Grund nicht anmelden können)
Wenn Sie den DataSourceTransactionManager von Spring verwenden, kann dieser im Fehlerfall festgeschrieben werden! ??
Was tun, wenn in Docker ein gcc-Fehler auftritt?
Wenn Sie die Java-Entwicklungsumgebung von Eclipse aus ändern möchten