Spring Boot @Aspect J ведение журнала

Я создал тестовое приложение Spring MVC с контроллером REST. Я хочу применить аспекты для своего метода some, но при вызове этого метода ничего не происходит, и я не могу найти причину. Это мой класс конфигурации и приложения:

@SpringBootApplication(scanBasePackages = "org.test")
@EnableAspectJAutoProxy
public class TestaopApplication {

public static void main(String[] args) {
    SpringApplication.run(TestaopApplication.class, args);
}
}

Это мой класс аспектов:

@Aspect
@Component
public class Logging {

private static final Logger logger = LoggerFactory.getLogger(GreetingController.class);
@Pointcut("execution(* org.test.restspring.model.Greeting.getCreatedDate(..))")
private void getDate(){}

@Before("getDate()")
public void beforeGettingDate(){
    logger.info("Date is asked");
}

@After("getDate()")
public void afterGettingDate(){
    logger.info("Date is received");
}

}

Это мой простой bean:

@Component
public class Greeting {

private long id;
private String content;
private Date created;

public Greeting() { }
public Greeting(long id, String content) {
    this.id = id;
    this.content = content;
    this.created = Calendar.getInstance().getTime();
}

public long getId() {
    return id;
}

public String getContent() {
    return content;
}

public String getCreatedDate(){
    return created.toString();
}
 }

Это мой контроллер:

@RestController
public class GreetingController {

private static final String template = "Hello, %s!";
private static final Logger logger = LoggerFactory.getLogger(GreetingController.class);
private final AtomicLong counter = new AtomicLong();

@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
    Greeting response = new Greeting(counter.incrementAndGet(),
            String.format(template, name));
    logger.info(response.getCreatedDate());
    return response;
}


}

Пожалуйста, помогите мне с этой проблемой.


person Yuriy    schedule 06.04.2016    source источник


Ответы (1)


Компоненты, созданные с помощью явного вызова конструктора (new Greeting(...)), не управляются Spring. Вот почему ваш аспект не применяется.

Вы можете попробовать использовать область прототипа. Таким образом, Spring создает новый экземпляр приветственного компонента для каждого запроса.

для фасоли:

@Component
@Scope("prototype")
public class Greeting {

и ваш контроллер:

@RestController
public class GreetingController {

private static final String template = "Hello, %s!";
private static final Logger logger = LoggerFactory.getLogger(GreetingController.class);
private final AtomicLong counter = new AtomicLong();

@Autowired
private Greeting greeting;

@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
    greeting.setId(counter.incrementAndGet());
    greeting.setContent(String.format(template, name))
    logger.info(response.getCreatedDate());
    return response;
}



}
person luboskrnac    schedule 06.04.2016
comment
Я обнаружил ошибку, но когда я заменяю метод на несуществующий в @Pointcut (этот аспект не применяется к методу), у меня нет ошибки. Это ошибка:: Не удалось написать HTTP-сообщение: org.springframework.http.converter.HttpMessageNotWritableException: Не удалось записать содержимое: не найден сериализатор для класса org.springframework.aop.TrueClassFilter и не обнаружено свойств для создания BeanSerializer (во избежание исключения, отключить SerializationFeature.FAIL_ON_EMPTY_BEANS) ) - person Yuriy; 06.04.2016
comment
И у меня есть геттеры и сеттеры в моем классе Greeting. - person Yuriy; 06.04.2016