0
aufgerufen

ich folgende Klasse haben zu überprüfen:Verfahren mit @AssertTrue ist nicht markiert

@Document(collection = "settings") 
public class Settings { 
    @NotEmpty 
    private String[] allowableExtensions; 
    ... 
    @AssertTrue(message = "Each extension must be alphanumeric string with length {2,4}") 
    public boolean assertTrue() { 
     for (String extension : allowableExtensions) { 
      if (extension == null || extension.matches("^[a-zA-Z0-9]{2,6}$")) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

und folgende Controller:

@PostMapping(value = "/settings/update", consumes = "application/json") 
public ResponseEntity<?> updateSettings(@RequestBody @Valid Settings settings, BindingResult bindingResult) { 
    if(bindingResult.hasErrors()){ 
     return ResponseEntity.badRequest().body(bindingResult.getAllErrors().get(0).getDefaultMessage()); 
    } 
} 

Ich habe nicht erwartet, Fehler finden und Breakpoint in assertTrue Methode setzen, aber Es ruft nicht auf.

Was mache ich falsch?

Antwort

1

assertTrue Die Methode folgt nicht der JavaBean-Konvention, und Sie führen keine Methodenvalidierung durch, daher wird sie nie aufgerufen, und Sie erhalten nicht die Verletzung, die Sie erwarten. So zum Beispiel, wenn Sie Ihre Setting Klasse so etwas wie

ändern
public class Settings { 

    @NotEmpty 
    private String[] allowableExtensions; 

    @AssertTrue(message = "Each extension must be alphanumeric string with length {2,4}") 
    public boolean isAssertTrue() { 
     for (String extension : allowableExtensions) { 
      if (extension == null || extension.matches("^[a-zA-Z0-9]{2,6}$")) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

sollten Sie diese Settings#isAssertTrue Methode aufgerufen erhalten und validiert Ergebnis.

Verwandte Themen