2017-10-19 25 views
0

Je construis un service Spring REST, et j'ai un tas de terminaux qui prennent une charge utile de requête via la méthode POST. J'ai inclus la spécification JSR 303 dans mon projet et cela fonctionne très bien pour les validations. Maintenant, comment faire pour que mon application envoie une réponse JSON avec un autre code d'état. À l'heure actuelle, l'application donne un 400 avec une page d'erreur tomcat.Envoyer une réponse de repos au lieu d'une page HTML lorsque javax.validation.constraints. * N'est pas atteint

Error from the application

Mise à jour:

je me suis dit que je dois inclure BindingResult dans ma méthode et donc je peux extraire les erreurs à partir de là.

@PostMapping(value = "/validateBankInformation", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 
protected ResponseEntity<BusinessSolutionVO> validateBankInformation(@Valid @RequestBody BankInformation bankInformation, BindingResult bindingResult) { 
    if (bindingResult.hasErrors()) { 
     List<ObjectError> errors = bindingResult.getAllErrors(); 
     for (ObjectError error : errors) { 
      System.out.println(error.getDefaultMessage()); 
     } 
    } 
} 
+0

Qu'avez-vous fait jusqu'à présent? – delephin

Répondre

0

Votre classe d'entités est-elle annotée correctement?

Vous devez définir le UniqueConstraints dans l'annotation @Table.

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "username" }), 
    @UniqueConstraint(columnNames = { "email" }), @UniqueConstraint(columnNames = { "field1", "field2" }) }) 
public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @Email 
    @NotNull 
    private String email; 

    @NotNull 
    @Size(min = 4, max = 24) 
    private String username; 

    @NotNull 
    private String password; 

    @NotNull 
    private String field1; 

    @NotNull 
    private String field2; 

    // Getters 
    // Setters 
    // Other Methods 

} 
0

Il existe différentes façons de résoudre ce problème. Mais le plus simple pour ce cas est de renvoyer la réponse d'erreur HTTP comme ci-dessous:

@PostMapping(value = "/validateBankInformation", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 
protected ResponseEntity<BusinessSolutionVO> validateBankInformation(@Valid @RequestBody BankInformation bankInformation, BindingResult bindingResult) { 

    if (bindingResult.hasFieldErrors()) { 
      String errors = bindingResult.getFieldErrors().stream() 
        .map(p -> p.getDefaultMessage()).collect(Collectors.joining("\n"));    
       //throw new InvalidRequestParameterException("Bad Request", errors); 

      return ResponseEntity.badRequest().body(errors); 
    } 

    return ResponseEntity.ok("Successful"); 
} 

Ou vous pouvez créer des messages d'exception personnalisés et de les jeter.