validation api in SpringMVC und Binding von Objekten in <form:input>

grindelaner

Bekanntes Mitglied
Ich möchte über die Validation API ein Objekt validieren und bei Fehler per CssKlasse das Feld einfärben.

Ich verwende Spring3 MVC

Beispiel:
HTML:
<form:label path="userName.value" for="userName" cssErrorClass="error_label">Benutzer*</form:label>
<form:input id="userName" path="userName" cssErrorClass="error_input"/>

Bitte beachte userName und userName.value

Ich validiere nicht direkt UserName als String, sondern auf das fachliche Objekt UserName.getValue.
Wenn es zu einem Fehler kommt liegt der BeanPropertyBindingResult.errors also im Feld „userName.value“!!!

Um ein Fehler in der JSP-Seite anzuzeigen, habe ich im <form:label> den Path auf userName.value gebunden (s.o). Das Funktioniert.
Bei einem Fehler bekommt das <label> die CssKlasse „error_label“ zugewiesen.


Das Problem:

Ich kann nicht den Fehler im Feld <form:input> anzeigen. Denn wenn ich die Daten einlesen möchte muss ich den Path auf userName binden. Wenn ich einen Fehler anzeigen möchte muss ich aber auf userName.value binden, da BeanPropertyBindingResult.errors nicht auf userName, sondern auf userName.value bindet!!!!

Kann mir jemand weiterhelfen?
 

grindelaner

Bekanntes Mitglied
Controller:
Java:
@Component
@RequestMapping(value = "/userEditor*.do")
public class UserEditorController {

...

@RequestMapping(method = RequestMethod.POST, value = "/userEditor.do")
    public String submit(@RequestParam(value = "userIdentificator", required = false) String userIdentificator,@ModelAttribute("user") @Valid UserPresentation presentation, BindingResult bindingResult) {
        String result;
        if (bindingResult.hasErrors()) {
            result = getView();
        } else {
            executeArchive(userIdentificator,presentation);
            result = "redirect:userAdministration.do";
        }
        return result;
    }

...

}
Wie du hier sehen kannst wird über "@Valid UserPresentation" die UserPresentation validiert.
In der UserPresentation befindet sich der UserName...

Java:
@UserPresentation.PasswordConfirm
public interface UserPresentation {

    @Valid
    public UserName getUserName();

...
}
UserName bzw. UserName.getValue soll ja validiert werden. UserName ist eine Klasse:
Java:
public class UserName implements Comparable<UserName> {
    
    @Column(name = "value")
    private String _value;
        
  	
  	// Constructors
  	public UserName() {  	
	}	
  	private UserName(String value) {
  		_value = value;
		}							
  	
	// Methods
	@Pattern(regexp = "\\w{2,20}")  
	public String getValue() {			
		return _value;						
	}	
	

...
...	
...
	
	  
	public static UserName valueOf(String value) {			
         ...
	}	
	
}
Über die valueOf-Methode wird UserName über Spring durch Reflection intern gebunden.
Und Hier ist nun auch das Problem. Denn beim Binding des Objektes UserName ist der Path "UserName"
Entsteht ein Fehler in der Validierung ist der FehlerPath "UserName.value".

Da <form:input cssErrorClass=""> nur befüllt wird, wenn der Path einen Fehler beinhaltet, kann bei dieser Konstellation nie ein Fehler angezeigt werden. Denn der ErrorPath ist "UserName.value" der Path für das Binding "UserName" und mit "UserName" muss ich arbeiten, da sonst das Objekt nicht gebunden werden kann.

Hast Du eine Idee wie ich das Problem lösen könnte?
 

pizza1234

Mitglied
Hi,
also ich muss sagen, das Spring 2.5 deutlich einfacher zu lesen ist! Ich verstehe aber nicht so ganz, was du validieren willst. Du kannst doch nicht das Objekt UserName validieren, sondern nur dessen Werte, wie zb. UserName.value usw. Warum kannst du nicht das Input-Feld auf UserName.value binden?

Grüße
Peter
 

Neue Themen


Oben