2016-09-10 7 views
2

Я использую dropwizard и имею службу, которая поддерживает как json, так и protobuf. Мне очень нравится нотация @Valid и аннотация для полей внутри моих классов запросов. Проблема в том, что нотация @Valid работает только для json, а не protobuf. Есть ли способ или хороший подход к тому, как заставить аннотацию @Valid работать независимо от медиа-типа?Dropwizard protobuf validation

Пример служба:

@POST 
@Produces({ 
     MediaType.APPLICATION_JSON, "application/x-protobuf" 
}) 
@Consumes({ 
     MediaType.APPLICATION_JSON, "application/x-protobuf" 
}) 
@Path("/foo") 
void foo(@Valid Request request); 

public class Request 
{ 
    @NotBlank(message = "Missing info") 
    String field; 
} 

ответ

0

Validations в Dropwizard, прежде чем версия 1.0.0 была сделана в JacksonMessageBodyProvider классе, который по существу является MessageBodyReader (класс, отвечающим за десериализацию ваших объектов POJO).

В качестве названия В этом классе Jackson эта функция, вероятно, предназначена только для работы с объектами, основанными на JSON.

Сказав, что единственной альтернативой является выполнение Validations себя в методе ресурсов, написав этот кусок кода,

Validator validator = environment.getValidator(); 
Set<ConstraintViolation<T>> violations = validator.validate(object, validationGroups); 

Iterate нарушений Набор для выявления всех нарушений в запросе POJO, который могут быть отправлены в полезной нагрузке при возврате ответа об ошибке HTTP 4xx.

С 1.0.0, идя этим Pull Request на Github. Перемещение логики проверки из Джексона в Джерси должно по существу позволить другим типам объектов использовать эту функцию. Реализация DropwizardConfiguredValidator зарегистрирована как ConfiguredValidator в Джерси, которая выполняет необходимые проверки.