Spring Boot Java реализация пользовательских аннотаций - PullRequest
1 голос
/ 09 января 2020

Я знаю, что это возможный дубликат, и я нашел несколько потоков, таких как Как найти все бины с пользовательской аннотацией @Foo? или Пользовательская аннотация не работает на бобах весны , но это не совсем то, что я делаю или хочу делать.

Я хочу простой валидатор для длины атрибутов класса. Не говорите мне о @Length или @Size. Они здесь не помогают. Я попробовал несколько решений, и ни одно из них не сработало.

CustomAnnotation:

@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CheckLengthValidator.class)
@Qualifier // got this one from a solution
public @interface CheckLength {
    Class<?> className();

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

    String message() default "List is not valid";

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

CustomAnnotationValidator (методы еще не реализованы):

public class CheckLengthValidator implements ConstraintValidator<CheckLength, List<Transaction>> {

    @Override
    public void initialize(CheckLength a) {
        //get values which are defined in the annotation
        System.out.println("init");
        test = a.message();

    }

    @Override
    public boolean isValid(List<Transaction> value, ConstraintValidatorContext context) {

        for (Transaction x : value) {
            if (x.getTimestamp().length() > 30) {
                System.out.println("not valid");
                return false;
            }
        }
        return true;
    }
}

Так, где мне использовать Это? В моем API, где есть все автоматические репозитории.

@CrossOrigin(origins = "http://localhost:4200")
@RestController
public class FileManagementRestAPI {

    @Autowired
    @CheckLength(className = Transaction.class)
    List<Transaction> transaction = new ArrayList<>();
...
}

Позже это будет вызвано для заполнения списка.

transaction.addAll((Collection<? extends Transaction>) csvToBean.parse());

Что я пробовал:

Я читал о решение, которое я позже обнаружил, что оно устарело или больше не работает с CommandLineRunner и AnnotationConfigApplicationContext.

Затем я прочитал, что должен объявить его как Bean, но список здесь не является Боб или мне все еще нужно что-то делать с Бобами? Видел что-то вроде этого, но не знал, что с ним делать тогда:

public class InitBeans implements BeanPostProcessor { ... }

Ошибка, которую я получаю сейчас:

Field transaction in com.stuff.project.apis.FileManagementRestAPI required a bean of type 'java.util.List' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)
    - @com.stuff.project.utils.CheckLength(message=List is not valid, groups=[], payload=[], className=class com.stuff.project.entity.Transaction)


Action:

Consider defining a bean of type 'java.util.List' in your configuration.

Было несколько других ошибок, когда я пытался запусти его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...