Spring не обнаруживает компонент, несмотря на то, что он находится в том же пакете и компоненте сканирования - PullRequest
0 голосов
/ 11 июля 2019

Итак, у меня есть приложение Spring, я добавил класс loggingHandler, используя аннотацию вместе с пользовательской аннотацией @Loggable. Я успешно регистрирую вызовы методов, определенные в классе @RestController, однако классы, аннотированные как @Component, похоже, не обнаруживаются пружиной ...

Вот часть кода:

package company;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;


@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass=true)
@ComponentScan({"company", "document", "logger", "model.bodyComponents"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Тогда API

package company;

@RestController
public class Api {

    @PostMapping(value = "/", consumes = MediaType.APPLICATION_XML_VALUE)
    @Loggable
    public ResponseEntity<?> convertXmlToPdf(HttpServletRequest request) {
                // some code
                root.render(outputStream); //it is called correctly
                // some code
    }

Затем метод render, который называется:

package company;

@Component
public class Root {

    @Loggable
    public void render(OutputStream target) throws IOException, ParseException, TypesetElementWidthException, ClassNotFoundException {

     //some code  

    }

}

Затем LoggingHandler:

@Aspect
@Configuration
public class LoggingHandler {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    @Pointcut("@annotation(logger.Loggable)")
    public void pcLoggable(){
    }

    @Before("@annotation(logger.Loggable)")
    public void beforeAnnotLog(JoinPoint joinPoint){

        log.info(joinPoint.getSignature() + "Something will be called called with loggable annot.", joinPoint);
        System.out.println("Test Loggable annotation Before the call");

    }

    @After("@annotation(logger.Loggable)")
    public void annotLog(JoinPoint joinPoint){

        log.info(joinPoint.getSignature() + "Something is called with loggable annot.", joinPoint);
        System.out.println("Test Loggable annotation");

    }

}

Наконец, записываемая аннотация:

package logger;

import java.lang.annotation.*;

@Target({ElementType.TYPE ,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Loggable {

}

Регистратор вызывается при вызове convertXmlToPdf (я разместил XML, и все работает нормально).

Эти методы вызывают метод Root.render, но в этом случае ничего не регистрируется, несмотря на то, что Root является компонентом, а рендер помечен @Loggable. Так что это заставляет меня думать, что весна не определяет класс Root как компонент ...

1 Ответ

0 голосов
/ 28 июля 2019

Как Api получает ссылку на класс Root?Полагаю, вы где-то делаете новый Root () вместо того, чтобы получить управляемый экземпляр Spring.- М. Дейнм, 11 июля в 10: 49

Да, есть новый Root (), но я не уверен, что понимаю, почему я должен использовать экземпляр, управляемый пружиной ... - Cromm11 июля в 11: 04

Ответ прост: потому что Spring AOP работает только с компонентами Spring.Он создает динамические прокси, чтобы регистрировать аспекты или советники для них и выполнять их всякий раз, когда вызывается метод прокси.Инстанцируя с помощью new Root(), вы обходите создание прокси, поэтому вы не можете ожидать, что какой-либо аспект Spring AOP будет работать там.Чтобы применить AOP к объектам, не управляемым Spring, вам необходимо использовать полный AspectJ.

@ M.Deinum, я написал этот ответ для того, чтобы закрыть тему.Я знаю, что вы могли бы написать это сами, но не сделали этого за 2 + недели, поэтому, пожалуйста, прости меня за то, что я украл это у тебя.Не стесняйтесь написать свой собственный ответ, тогда я удалю свой, и вы можете получить свой принятый.

...