java - Spring AOP 与 SPring MVC Controller 不工作

标签 java spring spring-mvc spring-aop

嗨,我正在使用以下基于注释的配置,来连接我的方面,该方面在 Spring Controller 上进行日志记录和其他横切方法调用。但似乎我正在使用的代码没有被调用。

    @Configuration
@EnableWebMvc
@EnableAspectJAutoProxy
@ComponentScan({"com.pumpkinsafari.api"})
public class WebConfig extends WebMvcConfigurerAdapter {

    /** The Constant DD_MM_YYYY. */
    private static final String DD_MM_YYYY = "yyyy-MM-dd";

    /** The Constant DATE_FORMAT. */
    private static final DateFormat DATE_FORMAT = new SimpleDateFormat(DD_MM_YYYY);

    /**
     * Instantiates a new web config.
     */
    public WebConfig() {
        super();
    }

    @Bean
    public RestControllerAspect controllerAspect(){
        return new RestControllerAspect();
    }

    // beans

    /**
     * Xstream marshaller.
     * 
     * @return the x stream marshaller
     */
    public XStreamMarshaller xstreamMarshaller() {
        final XStreamMarshaller xStreamMarshaller = new XStreamMarshaller();
        xStreamMarshaller.setAutodetectAnnotations(true);
        xStreamMarshaller.setAnnotatedClasses(new Class[] { Principal.class, Customer.class, Role.class,
                Privilege.class, SocialUser.class, SearchRequest.class });
        xStreamMarshaller.getXStream().addDefaultImplementation(java.sql.Timestamp.class, java.util.Date.class);

        return xStreamMarshaller;
    }

    /**
     * Marshalling http message converter.
     * 
     * @return the marshalling http message converter
     */
    public MarshallingHttpMessageConverter marshallingHttpMessageConverter() {
        final MarshallingHttpMessageConverter marshallingHttpMessageConverter = new MarshallingHttpMessageConverter();
        final XStreamMarshaller xstreamMarshaller = xstreamMarshaller();
        marshallingHttpMessageConverter.setMarshaller(xstreamMarshaller);
        marshallingHttpMessageConverter.setUnmarshaller(xstreamMarshaller);

        return marshallingHttpMessageConverter;
    }

    // template

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
     * #configureMessageConverters(java.util.List)
     */
    @Override
    public void configureMessageConverters(final List<HttpMessageConverter<?>> messageConverters) {
        messageConverters.add(marshallingHttpMessageConverter());

        final ClassLoader classLoader = getClass().getClassLoader();
        if (ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)) {
            MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
            jackson2HttpMessageConverter.getObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
            // Register date format for marshalling unmarshalling dates
            jackson2HttpMessageConverter.getObjectMapper().setDateFormat(DATE_FORMAT);
            messageConverters.add(jackson2HttpMessageConverter);
        } else if (ClassUtils.isPresent("org.codehaus.jackson.map.ObjectMapper", classLoader)) {
            MappingJacksonHttpMessageConverter jacksonHttpMessageConverter = new MappingJacksonHttpMessageConverter();
            jacksonHttpMessageConverter.getObjectMapper().disable(
                    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
            // Register date format for marshalling unmarshalling dates
            jacksonHttpMessageConverter.getObjectMapper().setDateFormat(DATE_FORMAT);
            messageConverters.add(jacksonHttpMessageConverter);
        }

        super.configureMessageConverters(messageConverters);
    }

}

但是我的方面没有被调用..方面类如下

@Aspect
public class RestControllerAspect {

    @Pointcut("within(@org.springframework.stereotype.Controller *)")
    public void controller() {
    }

    @Pointcut("execution(* *(..))")
    public void methodPointcut() {
        System.out.println("Invoked: ");
    }

    @Pointcut("within(@org.springframework.web.bind.annotation.RequestMapping *)")
    public void requestMapping() {
        System.out.println("Invoked: ");
    }

    @Before("controller() && methodPointcut() && requestMapping()")
    public void aroundControllerMethod(JoinPoint joinPoint) throws Throwable {
        System.out.println("Invoked: " + niceName(joinPoint));
    }

    @AfterReturning("controller() && methodPointcut() && requestMapping()")
    public void afterControllerMethod(JoinPoint joinPoint) {
        System.out.println("Finished: " + niceName(joinPoint));
    }

    private String niceName(JoinPoint joinPoint) {
        return joinPoint.getTarget().getClass() + "#" + joinPoint.getSignature().getName() + "\n\targs:"
                + Arrays.toString(joinPoint.getArgs());
    }

}    

请帮助某人!!!

最佳答案

更改您的@Pointcut定义。对于类型而不是 within(@.... 使用 @within(....),对于方法而不是 within(@.... 使用 @annotation(....

参见spring referene有关切入点的更多信息

关于java - Spring AOP 与 SPring MVC Controller 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22859532/

相关文章:

java - 使用tomcat7部署并自动编译servlet

java - 从通知实例化 Activity 启动 Activity ,即使已经存在

java - 配置 : error: Could not detect the location of the Java shared library. 您将需要更新 java.m4 以添加对此 JVM 配置的支持

java - Spring 3 安全性 j_spring_security_check

java - Spring - Hibernate JPA 配置中的问题设置方言

java - 地理工具,Java : How to convert shapefile data from DOR to usable polygons with Latitude and Longitude coordinates

java - 将 Spring 2.5 与 Ibatis 3 集成

spring - 获取 SDG 2.0 中的注释,获取策略问题

java - java - 如何在java中将多个文件从src原子复制到dest?

spring-mvc - Spring MVC 与 Spring Security 的集成测试