2016-05-04 11 views
0

Ich arbeite in einem Grails 2.4.4 Anwendung, die einige Legacy-Code, der keine Bindung oder Befehlsobjekte in Controllern verwendet hat, in dieser Anwendung die Anfrage-Parameter von Controller-Aktionen direkt übergeben werden Java-Klassen mit ihren Konstruktoren.Trimming String Request Parameter in Controller-Aktionen

Wir wollen weiße Leerzeichen aus Strings-Parametern trimmen (genau wie Grails beim Binden standardmäßig), aber ohne Binde- oder Befehlsobjekte.

Vielleicht injiziert eine geklonte Version der Variablen Varible aber mit getrimmten Werten?

Hat jemand von euch so etwas getan?

Antwort

2

Hier ist eine Implementierung, die ich in einer 2.x-App in einem Filter verwendet. Es unterstützt verschachtelte Objekte durch Aufruf der Methode rekursiv:

def filters = { 
    blankToNullAndTrim(controller: '*', action: '*') { 
     before = { 
     convertBlanksToNullsAndTrim params 
     true 
     } 
    } 
} 

private static void convertBlanksToNullsAndTrim(Map<String, Object> map) { 
    def keys = map.keySet() as List // copy to avoid ConcurrentModificationException 
    for (name in keys) { 
     def value = map[name] 
     if (value instanceof String) { 
     value = value.trim() 
     if (value.length() == 0) { 
      map[name] = null // have to explicity set to null, not remove 
     } 
     else { 
      map[name] = value // update if trimmed 
     } 
     } 
     else if (value instanceof Map) { 
     // empty nested param, e.g. "location":["id":""] 
     convertBlanksToNullsAndTrim value 
     } 
    } 
} 

und hier ist die entsprechende Umsetzung (mit Typ-Informationen enthalten, damit Sie @GrailsCompileStatic verwenden können) zur Verwendung in einem Abfangjäger, wenn Sie auf Grails 3.x aktualisieren:

boolean before() { 
    convertBlanksToNullsAndTrim params 
    true 
} 

private void convertBlanksToNullsAndTrim(Map<String, Object> map) { 
    List<String> keys = map.keySet() as List // copy to avoid ConcurrentModificationException 
    for (String name in keys) { 
     def value = map[name] 
     if (value instanceof String) { 
     value = value.trim() 
     if (value.length() == 0) { 
      map[name] = null // have to explicity set to null, not remove 
     } 
     else { 
      map[name] = value // update if trimmed 
     } 
     } 
     else if (value instanceof Map) { 
     // empty nested param, e.g. "location":["id":""] 
     convertBlanksToNullsAndTrim value 
     } 
    } 
} 
+0

Dank Burt, das ist genau das, was wir brauchten! – solaechea

0

Eine Option besteht darin, dynamisch gelöste Variablen in UrlMappings.groovy zu verwenden. Zum Beispiel, wenn eine Abbildung ist wie folgt:

"/airport/status(controller: 'airport', action: 'checkStatus') 

und einen Anforderungsparameter als airportName dann kann erwartet, dass es wie folgt umgeschrieben werden:

"/airport/status(controller: 'airport', action: 'checkStatus') { 
    airportName = { params.airportName?.trim() } 
} 

Dies würde sicherstellen, dass die willkürliche Variable params gesetzt Nach dem Trimmen des aktuellen Anforderungsparameters airportName. Es muss darauf geachtet werden, dass derselbe Variablenname wie der Anforderungsparameter verwendet wird, um das darunter liegende Legacy-System zu unterstützen.

Eine weitere Option kann die Verwendung eines filter über den Controller zum Trimmen der Anforderungsparameter sein. Etwas wie:

class UtilityFilters { 
    def filters = { 
     trim(controller: "airport", action: "*") { 
      before = { 
       // If immutable then make a copy and edit 
       params.airportName = params.airportName?.trim() 
       return true 
      } 
     } 
    } 
} 
Verwandte Themen