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
- 正如第一条评论所指出的那样,您的切入点定义中有一个拼写错误:)
您好,我正在尝试使用 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
- 正如第一条评论所指出的那样,您的切入点定义中有一个拼写错误:)