2017-01-13 2 views
0

C'est quelque chose de vraiment simple, mais je ne pouvais pas trouver un bon exemple:SpringMVC Checkbox: Liaison personnalisée/PropertyEditorSupport pour Personnalisé

J'ai un type de données personnalisé que je voudrais lier à une case à cocher SpringMVC, il ressemble à ceci: OUI/NON:

public enum YesNoDataType { 
    YES("Yes"), 
    NO("No"); 
} 

SpringMVC auto-cases carte à booléens, maintenant je dois carte sélectionnée-> OUI, Empty-> NO.

Je sais que je dois implémenter l'une de ces 4 méthodes PropertyEditorSupport, mais lesquelles et comment?

<form:checkbox path="testYesNo"></form:checkbox> 

Modèle

private YesNoDataType testYesNo; 

Contrôleur

binder.registerCustomEditor(YesNoDataType.class, new PropertyEditorSupport() { 

      // Which ones to override? 

      @Override 
      public void setValue(Object value) { 
       // TODO Auto-generated method stub 
       super.setValue(value); 
      } 

      @Override 
      public Object getValue() { 
       // TODO Auto-generated method stub 
       return super.getValue(); 
      } 

      @Override 
      public String getAsText() { 
       // TODO Auto-generated method stub 
       return super.getAsText(); 
      } 

      @Override 
      public void setAsText(String text) throws IllegalArgumentException { 
       // TODO Auto-generated method stub 
       super.setAsText(text); 
      } 

}); 

Répondre

0

J'ai essayé de définir et d'enregistrer des convertisseurs (YesNoDataType/booléennes), mais je vois dans CheckboxTag.java de SpringMVC qu'ils sont tous inutiles . Aucun convertisseur ou tweaks de liaison fonctionnera, car l'étiquette vérifie explicitement booléens et cordes seulement:

protected void writeTagDetails(TagWriter tagWriter) throws JspException { 
    tagWriter.writeAttribute("type", getInputType()); 

    Object boundValue = getBoundValue(); 
    Class<?> valueType = getBindStatus().getValueType(); 

    if (Boolean.class.equals(valueType) || boolean.class.equals(valueType)) { 
     // the concrete type may not be a Boolean - can be String 
     if (boundValue instanceof String) { 
      boundValue = Boolean.valueOf((String) boundValue); 
     } 
     Boolean booleanValue = (boundValue != null ? (Boolean) boundValue : Boolean.FALSE); 
     renderFromBoolean(booleanValue, tagWriter); 
    } 

    else { 
     Object value = getValue(); 
     if (value == null) { 
      throw new IllegalArgumentException("Attribute 'value' is required when binding to non-boolean values"); 
     } 
     Object resolvedValue = (value instanceof String ? evaluate("value", value) : value); 
     renderFromValue(resolvedValue, tagWriter); 
    } 
} 

La chaîne de liaison est hors de propos pour moi. Dans la liaison de chaîne getValue() (clause 2), une case à cocher est sélectionnée si son attribut value="" correspond à la chaîne dans le modèle. Ce dont j'ai besoin est une liaison booléenne Vrai/Faux, mais mon convertisseur doit être branché sur la clause n ° 1 pour obtenir un booléen d'un type personnalisé. Juste très frustré que le printemps est si restrictif dès que vous essayez d'aller en dehors des paramètres étroits de ce qui est commun. Le problème est toujours en suspens.