2012-07-02 13 views
7

Utilizzando Primavera 3.1 e dato questo genere di cose:Spring MVC ignora configurato PropertyEditor e usa costruttore invece

class Thing { 
    public Thing() {} 
    public Thing(String someProperty) {} 
} 

class ThingEditor extends PropertyEditorSupport{ 
    @Override 
    public void setAsText(String text) { 
     if (text != null) { 
      Thing thing = new Thing(text); // or by using a setter method 
      setValue(thing); 

     } 

    } 
} 

class SomeController { 
    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(Thing.class, new ThingEditor()); 
    } 
} 

ho scoperto che l'editor di proprietà registrato non era stato chiamato a meno che non ho tolto il costruttore che prende una stringa in Thing - è giusto?

Perché sta facendo questo e ignorando l'editor registrato e come posso farlo smettere di farlo?

+0

ti invitiamo a mostrare un po 'di più del metodo setAsText sopra. –

+0

Aggiornato - ma il contenuto di questo metodo non è il problema - quando il debug non entrerà mai in questo metodo se la classe ha il costruttore String. – blank

+0

Probabilmente perché stai inviando un campo con lo stesso nome di "someProperty", in questo caso potrebbe non chiamare il binder per creare l'oggetto "Thing", ma usando setter o il costruttore per impostare la proprietà. Potrebbe essere meglio inviare una proprietà per nome "cosa" e quindi per inserire esplicitamente un @RequestParam (..), questo potrebbe costringere il raccoglitore. –

risposta

0

Introducendo il proprio costruttore, si disabilita il costruttore predefinito generato dal compilatore. Il costruttore predefinito è probabilmente richiesto dal framework per poter istanziare la tua cosa. Se hai davvero bisogno del tuo costruttore, potresti anche fornire una versione senza parametri per l'uso del framework.

+0

C'era anche il costruttore predefinito, aggiunto alla domanda. – blank

0

Bloccare il nome della proprietà quando si registra la PropertyEditorSupport:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Thing.class, "someProperty", new ThingEditor()); 
} 
Problemi correlati