DropWizard @ValidationMethod Промяна на името на свойството

Имам представяне в Dropwizard, което има методи с анотацията @ValidationMethod.

Пример за Dropwizard:

@ValidationMethod(message="may not be Coda")
public boolean isNotCoda() {
return !("Coda".equals(name));
}

Моля, обърнете внимание, че методът трябва да започва с is. Това е ограничение на Hibernate Validator.

Моят пример:

@NotBlank(message = REQUIRED)
private String password;


@JsonIgnore
@ValidationMethod(message = "the password fields must match")
public boolean isPasswordEqualRepeatedPassword() {
    
}

@JsonIgnore
@ValidationMethod(message = "the password must not contain or be equal to the username")
public boolean isNotEqualOrContainUsername(){

}

Текущ отговор:

поле : PasswordEqualRepeatedPassword, съобщение = полетата за парола трябва да съвпадат

поле : NotEqualOrContainUsername, съобщение = паролата не трябва да съдържа или да е равна на потребителското име

Искам полето да е равно на парола като атрибута на класа. Проблемът е, че не мога да назова методите на isPassword(), за да получа следния отговор:

поле : парола, съобщение = полетата за парола трябва да съвпадат

поле : парола, съобщение = паролата не трябва да съдържа или да е равна на потребителското име

Има ли начин това да стане?


person user3722804    schedule 17.06.2015    source източник


Отговори (1)


Това е възможно, за съжаление, чрез повторно прилагане на много от това, което dropwizard е внедрил. Трябваше да върнем потребителски обекти при грешка, а освен това имаше и други недостатъци, така че влезе в някаква заешка дупка за отражение. Все пак го внедрихме отдавна, така че сега може да е по-лесно, така че просто ще споделя съответните части, за да постигна това.

За този конкретен проблем направихме заобиколно решение, като добавихме персонализиран формат на низ към съобщенията за проверка.

  @ValidationMethod(message = "[password]the password fields must match")

И след това, когато анализираме съобщението, хващаме полето за парола.

Първо, ние сами се справяме с грешките при валидиране, като внедряваме картограф на изключения.

public class UnprocessableEntityExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

  @Override
  public Response toResponse(ConstraintViolationException exception) {
    return Response
        .status(422)
        .entity(doMagic(exception))
        .type(MediaType.APPLICATION_JSON_TYPE)
        .build();
  }
}

doMagic е потенциалната заешка дупка, но препоръчвам да изпробвате нещата и да отстраните грешки там и след това да върнете обект, който ще представи вашата грешка в JSON. Съответни битове:

  • exception.getConstraintViolations() ще върне списък с нарушения, върху които трябва да се работи.
  • constraintViolation.getConstraintDescriptor().getAnnotation() instanceof ValidationMethod е как да разберете, че това е Dropwizard ValidationMethod.
  • constraintViolation.getMessage() ще върне "[password]the password fields must match" в този пример.
person Natan    schedule 26.01.2021