2013-10-24 9 views
5

Wenn ich nicht @RequestBody@PathVariableid verwenden wird automatisch auf meine Entity Klasse festgelegt. Aber wenn ich @RequestBody verwende ist es nicht. Ich brauche, dass die id von Entity gesetzt ist, bevor meine GenericValidator Validierung durchführt. Warum funktioniert es ohne @RequestBody und nicht damit?@PathVariable nicht verbindlich mit @RequestBody

Das Entity-Klasse:

public class Entity { 

    private String id; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    //... 

} 

Die Controller-Klasse:

@Controller 
@RequestMapping(value = "/entity") 
public class EntityController { 

    @Autowired 
    private GenericValidator validator; 

    @InitBinder 
    private void initBinder(WebDataBinder binder) { 
     binder.addValidators(validator); 
    } 

    @RequestMapping(value = "/{id}", method = RequestMethod.PUT) 
    public @ResponseBody Response update(
      @PathVariable String id, 
      @Valid @RequestBody Entity entity) 
    { 
     //... 
    } 
} 

Antwort

3

Bei alleiniger Verwendung @Valid funktioniert ähnlich wie @ModelAttribute. Das Entity-Methodenargument würde vom Model abgerufen oder instanziiert werden, der WebDataBinder würde den Datenbindungsprozess bearbeiten (dies wäre der Fall, wenn die ID gesetzt würde), und dann würde die Validierung stattfinden.

@RequestBody-Argumente durchlaufen nicht den Datenbindungsprozess wie @ModelAttribute-Argumente. Sie werden über einen HttpMessageConverter mithilfe des Rumpfs der Anforderung erstellt, anstatt die Namen der Anforderungsparameter und Pfadvariablen mit den Namen der Felder Ihres Objekts abzugleichen. Bei der Kombination mit @Valid wird der konfigurierte Validator für das neue Objekt ausgeführt, aber die Datenbindung von @ModelAttribute-Stil tritt immer noch nicht auf.

+1

also gibt es keine Möglichkeit, dies mit @RequestBody zu arbeiten? – dblank

Verwandte Themen