2016-10-18 5 views
0

У меня есть конечная точка, где пользователь может зарегистрировать свой адрес электронной почты/пароль. Однако я хочу проверить, что пароль не пуст, но я также хочу только десериализовать пароль, потому что я не хочу отправлять его клиенту.Hibernate Validator С группами проверки для сериализации с доступом к записи

домена

public class User { 
    @NotEmpty 
    private String email; 
    @JsonProperty(access = Access.WRITE_ONLY) 
    @NotEmpty 
    private String password; 

    // Getters and setters 
    ... 
} 

Endpoint

@Path("/register") 
@POST 
public Response register(@Valid User user) { 
    ... 
} 

Вместо Access.WRITE_ONLY Я также попытался @JsonIgnore на поглотителе и @JsonProperty на сеттера.

Проблема заключается в Hibernate Validator продолжает жаловаться, что пароль пуст, даже когда я отправляю пользователю набор пароля:

"{"errors":["password may not be empty"]}" 

Как я могу это исправить? Или мне нужно реализовать собственную логику проверки NotEmpty в конечной точке?

ответ

1

Это можно сделать с помощью групп проверки. Вот как вы бы достичь этого:

public class GroupValidationTest { 


    public static void main(String[] args) { 
     Validator v = Validators.newValidator(); 


     Model m = new Model(); 
     m.user = "Harry"; 
     m.password = "Potter"; 

     Set<ConstraintViolation<Model>> validate = v.validate(m, INPUT.class); 
     System.out.println(validate.size()); 

     validate = v.validate(m, INPUT.class, OUTPUT.class); 
     System.out.println(validate.size()); 

     validate = v.validate(m, OUTPUT.class); 
     System.out.println(validate.size()); 

     m.password = null; 

     validate = v.validate(m, INPUT.class, OUTPUT.class); 
     System.out.println(validate.size()); 

     validate = v.validate(m, OUTPUT.class); 
     System.out.println(validate.size()); 
    } 

    public static class Model { 

     @NotEmpty(groups={INPUT.class, OUTPUT.class}) 
     public String user; 

     @NotEmpty(groups={INPUT.class}) 
     public String password; 

    } 

    public interface INPUT {} 
    public interface OUTPUT {} 

} 

Это выходы:

0 -> Full object, validate INPUT 
0 -> Full object, validate INPUT + OUTPUT 
0 -> Full object, validate OUTPUT 
1 -> null password, validate INPUT + OUTPUT 
0 -> null password, validate OUTPUT 

Explenation:

рамки валидатор Hibernate поддерживает группы для ограничения проверки. Они используются для проверки валидатора, который группируется для проверки в конкретной попытке проверки. Вы можете прочитать об этом здесь:

https://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#example-group-interfaces

То, что я сделал в моем примере кода является:

  • Определение 2 группы INPUT и OUTPUT
  • Марк собственностью пользователя быть подтверждено для обоих группы
  • Отметить имущество, подлежащее аттестации, только на вход

Для аспекта REST (другой вопрос), обычно проверка ввода и вывода выполняется перехватчиком, обычно классом MessageBodyReader и Writer. Они отвечают за чтение пользовательского ввода и его запись. Вы можете прочитать об этом на странице dersey docs.

После этого вы можете реализовать свой собственный считыватель/запись для проверки подлинности, который знает только для проверки INPUT при чтении ввода пользователя, а только проверки OUTPUT при записи сериализованного тела назад.

Я надеюсь, что помогает,

артур