2010-06-04 7 views
18

Gibt es eine einfache Möglichkeit, leere Formulareingabe in null Strings in Java zu verwandeln? Ich verwende spring mvc und SimpleJdbcInsert, um das Objekt in eine MySQL-Datenbank einzufügen. Ich möchte die leere Eingabe in der Datenbank auf NULL setzen und nicht auf ''. Ich habe einige Felder, und ich hoffe auf einen Weg, dies zu tun, ohne jeden Wert manuell zu überprüfen.Gibt es eine einfache Möglichkeit, leere Java/Spring-Formulareingabe in leere Strings zu verwandeln?

Danke!

bearbeiten - Also ich bin ein Idiot. Mehrere Fehler meinerseits führten zu der Annahme, dass die richtigen Antworten nicht korrekt waren.

class StringEditor extends PropertyEditorSupport { 
    public void setAsText(String text) { 
     String value = text.trim(); 
     if ("" == value) { 
      setValue(null); 
     } 
     else { 
      setValue(value); 
     } 
    } 
} 

Zwei Probleme - erstens kein getAsText, so wurde meine Form mit "null" Strings bevölkert zu werden: Ich hatte einen propertyEditorSupport so geschrieben! Zweitens ist meine Gleichheitsprüfung C++, nicht Java. Als ich den empfohlenen Setter ausprobierte, lud ich gerade den Post neu, der bereits die "Null" -Strings enthielt. Nachdem ich alles aufgeräumt hatte, fing alles an zu arbeiten. Danke für die Hilfe und Entschuldigung für meinen "Bedienungsfehler"!

Brett

Antwort

47

Die Klasse Sie suchen ist:

org.springframework.beans.propertyeditors.StringTrimmerEditor 

Wenn Sie es mit einer true konstruieren, wird leere/Whitespace-Zeichenfolgen in null konvertiert. Wie man es in den Ordner einträgt, hängt davon ab, ob es als Standard oder nur für bestimmte Ansichten gelten soll.

zum Beispiel auf einem einzigen Controller können Sie einfach hinzufügen

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); 
} 

instructions here

+0

Siehe meine Kommentare zu Bozho in Bezug auf registerCustomEditor funktioniert nicht im Frühjahr 2.5.5 –

+0

Nun, ich kann nicht auf 2.5.5 schwören, aber ich bin ziemlich sicher, dass bei 2.5.6 und 3, dass es die Zeichenfolge auf die Nullreferenz setzt legt keine Zeichenfolge mit dem Wert "null" fest Vielleicht könnten Sie, wenn Sie Ihrer Frage den fehlerhaften Code hinzufügen, mehr helfen? – Affe

+0

Siehe meine Bearbeitung zum ursprünglichen Beitrag. Mein Böses, danke für deine Geduld. –

0

der Standardwert für Ihre optionalen Felder auf NULL gesetzt - eigentlich ist es nicht NULL standardmäßig?

Parse Ihre String-Eingang und dann explizit nur bevölkerten Spalten angeben mit

usingColumns 

oh, und ich würde ihnen empfehlen, die Ihre Eingaben zu sanieren ...

+0

Könnten Sie mir sagen, wie man den Standardwert auf NULL setzt?Ich bekomme leere Strings zurück, also vermute ich, dass NULL nicht der Standard ist. –

+0

Ich denke, es ist der Standard, aber Sie können auch eine explizite DEFAULT NULL-Klausel zu jedem Feld hinzufügen. http://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html NB - Beachten Sie meine strikethru - Ich lese dies zunächst außerhalb des Kontexts der SimpleJdbcInsert Klasse – blissapp

+0

Ok, ich habe Standard NULL für die Datenbank. Ich dachte, Sie verweisen auf eine Möglichkeit, null als das Standard-Java-String-Ergebnis für leere Eingabe im Formular festzulegen! Das Problem mit usingColumns (denke ich) ist, dass es (String ...) als Argumente braucht - ich muss sie hart codieren, nicht eine Liste von String-Argumenten zur Laufzeit dynamisch erstellen, indem ich die Werte überprüfe. Ich könnte auch die Getter null für leere Zeichenfolgen zurückgeben lassen, was vergleichbar erscheint, aber wiederum bedeutet, jeden Wert zu überprüfen. –

2

Vielleicht können Sie eine custom Binder verwenden

+0

Ich habe das versucht, aber es gibt einen String zurück. Der Versuch, setValue (null) zu setzen, hat mich mit Strings == "null" verlassen (das Vier-Buchstaben-Wort "null", nicht der Wert null). Nicht ganz, wonach ich gesucht habe! –

+0

Kannst du 'null' String nicht zurückgeben? – Bozho

+0

Benutzerdefinierte Bindemittel ist richtig. Wo siehst du das? Strings == "null" '; Was machst du gerade? Erstellen Sie eine SQL-Zeichenfolge, wenn dies nicht der Fall ist. Benutze ein Prepretierbares. – Justin

8

Ich weiß, das ist alt, aber ich verschwendete etwa 2 bis 3 Stunden, bis ich einen sehr einfachen Weg gefunden, eine anzuwenden StringTrimmerEditor mit einem Ordner für alle meine Controller.

Noch einmal: Ich muss an RTFM erinnern.

Im Frühling 3.2 können Sie eine @ControllerAdvice -verwendete Controller-Klasse erstellen und die @InitBinder -annotierte Methode verwenden, wie im Beispiel @Affe angegeben. Hier

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-initbinder-advice

ist ein Beispiel:

@ControllerAdvice 
@Controller 
public class AppBindingInitializer { 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); 
    } 

} 

Hoffe, dass es jemand hilft.

+0

Vielen Dank für Ihre Freigabe. –

+0

Beste Antwort, die ich gefunden habe, einschließlich aller SO bezogenen Fragen, die ich fand! – NickGreen

+0

Warum benötigen Sie '@ Controller' und' @ ControllerAdvice'-Annotationen auf derselben Bean? – naXa

Verwandte Themen