Spring 未调用方法后的 aop

Spring aop after method not being called

您好,我正在尝试使用 Spring aop 的 @After 注释 更新数据库,但是未调用使用 @After 注释的方法。

这是我的 SignupController:

package com.jpizza.web;

import com.jpizza.model.Customer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;


@Controller
@RequestMapping("/signup")
public class SignupController {

    @RequestMapping(method=GET)
    public String signup(){
        return "signup";
    }

    @RequestMapping(method=POST)
    public String formHandler(Customer customer){
        return "home";
    }
}

这是我的看点class:

    package com.jpizza.db;

import com.jpizza.model.Customer;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

/**
 * Creed is a worker at jois pizza who registers users
 */
@Aspect
public class Creed implements CustomerDao{

    @Autowired
    private JdbcTemplate template;

    //This method is not being executed
    @After("execution(* com.jpizza.SignupController.formHandler(..)) && args(customer)")
    @Override
    public void saveCustomer(Customer customer) {
        System.out.println("About to update data");
        String sql = "INSERT INTO customer (username, email, password) VALUES (?,?,?)";
        template.update(sql, customer.getUsername(), customer.getEmail(),customer.getPassword());
    }

}

这是我的 WebConfig.class:

    @Configuration
@EnableWebMvc
@ComponentScan("com.jpizza.web")
@PropertySource("classpath:database.properties")
@EnableAspectJAutoProxy
public class WebConfig extends WebMvcConfigurerAdapter{

    @Autowired
    private Environment env;

    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);

        return resolver;
    }

    @Bean
    public DataSource dataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
        dataSource.setDriverClassName(env.getRequiredProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getRequiredProperty("jdbc.url"));
        dataSource.setUsername(env.getRequiredProperty("jdbc.username"));
        dataSource.setPassword(env.getRequiredProperty("jdbc.password"));
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource source){
        JdbcTemplate jt = new JdbcTemplate(source);
        jt.setResultsMapCaseInsensitive(true);
        return jt;
    }

}

没有错误被记录。我试图在执行 formHandler(Customer) 之后执行 saveCustomer(Customer) 但它不起作用。正在重定向页面 home.jsp 谁能告诉我哪里出错了??

编辑:

我按照建议更改了我的代码,但 @After 仍然没有被执行

WebConfig.java:

@Configuration
@EnableWebMvc
@ComponentScan("com.jpizza.web")
@PropertySource("classpath:database.properties")
@EnableAspectJAutoProxy
public class WebConfig extends WebMvcConfigurerAdapter{

    @Autowired
    private Environment env;

    //added creed as a bean        
    @Bean
   public Creed creed(){
       return new Creed();
   }

    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);

        return resolver;
    }

    @Bean
    public DataSource dataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
        dataSource.setDriverClassName(env.getRequiredProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getRequiredProperty("jdbc.url"));
        dataSource.setUsername(env.getRequiredProperty("jdbc.username"));
        dataSource.setPassword(env.getRequiredProperty("jdbc.password"));
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource source){
        JdbcTemplate jt = new JdbcTemplate(source);
        jt.setResultsMapCaseInsensitive(true);
        return jt;
    }

}

Creed.java:

    @Aspect
public class Creed implements CustomerDao{

    @Autowired
    private JdbcTemplate template;
    //changed the package name
    @After("execution(* com.jpizza.web.SignupController.formHandler(..)) && args(customer)")
    @Override
    public void saveCustomer(Customer customer) {
        System.out.println("About to update data");
        String sql = "INSERT INTO customer (username, email, password) VALUES (?,?,?)";
        template.update(sql, customer.getUsername(), customer.getEmail(),customer.getPassword());
    }




}

class SignUpController 没有实现接口。尝试在 @EnableAspectJAutoProxy

中启用 proxyTargetClass
@EnableAspectJAutoProxy(proxyTargetClass = true)

您的配置有两个问题:

  • Spring 对你的方面一无所知,你必须用 Spring 的构造型注释之一(例如@Component)对其进行注释,或者通过你的 @Bean 注释定义它网络配置 class
  • 正如第一条评论所指出的那样,您的切入点定义中有一个拼写错误:)