Как перехватить метод перед вызовом и проверить param? - PullRequest
0 голосов
/ 21 мая 2018

Как перехватить метод с перед вызовом и проверить param?

Я добавляю пользовательские аннотации Dto, DtoFiels и записываю их в RestController и метод createEntity.Как проверить все поля, аннотированные в аннотированном объекте DtoFiels.Я пытаюсь добавить BeanPostProcessor и вызывать с Proxy.newProxyInstance с InvocationHandler, но он выбрасывает ExceptionHandlerExceptionResolver - Resolved exception caused by Handler execution: org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction

Я пытаюсь добавить ConstraintValidator с моей аннотацией и аннотацией @Valid, но она проверяет все поля с аннотацией @NotNull и @CreatedDate.

метод

 @PostMapping @Dto
 public CompletableFuture<Response> createEntity(@RequestBody Entity entity) {

Сущность класса:

@Column(nullable = false)
protected String name;

protected String description;

@Column(nullable = false, updatable = false)
@CreatedDate
protected LocalDateTime creationDate;

@NotNull
protected boolean deleted;

@NotNull
@LastModifiedDate
protected LocalDateTime modificationDate;

1 Ответ

0 голосов
/ 21 мая 2018

Вы можете использовать группы проверки, чтобы определить, какие ограничения должны проверяться, а какие - нет.Я предполагаю, что когда вызывается createEntity, вы не хотите применять @NotNull и другие проверки.Вместо этого вы хотите, чтобы выполнялся какой-то другой пользовательский код проверки ...

Определите свои проверки в ограничении на уровне класса .

@Data
public class Person {

    @NotEmpty
    @Size(min = 10)
    @Pattern(regexp = "[0-9]*")
    private String name;
}

Пользовательском ограничении на уровне класса

@Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { PersonValidator.class })
@Documented
public @interface ValidPerson {

    String message() default "Invalid person";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

Валидатор для пользовательского ограничения, определенного выше, который только проверяет, что имя не является нулевым.Проверки размера и регулярных выражений не применяются.

public class PersonValidator implements ConstraintValidator<ValidPerson, Person> {
    @Override
    public boolean isValid(Person person, ConstraintValidatorContext context) {
        // Add your validation code here
        if (person == null) {
            return true;
        }
        return person.getName() != null;
    }
}

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

public interface CustomPersonGroup {

}

@Service
@Validated
public class SomeService {

    public void test(@Validated(value = CustomPersonGroup.class) @ValidPerson Person person) {

    }
}

Если проверки, которые вы хотите выполнить, могут быть выражены в виде стандартных аннотаций проверки компонентов, вы можете сделать следующее.

@Data
public class Person {

    @NotEmpty(groups = CustomPersonGroup.class)
    @Size(min = 10)
    @Pattern(regexp = "[0-9]*")
    private String name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...