Witaj, próbuję zaktualizować bazę danych za pomocą adnotacji @after @after sprężyny , ale metoda opatrzona z @After nie jest nazywana.

To mój 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";
    }
}

To moja klasa aspektu:

    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());
    }

}

To jest mój 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;
    }

}

Nie są rejestrowane błędy. Próbuję wykonać saveCustomer(Customer) po wykonaniu formHandler(Customer) jest wykonywany, ale nie działa. Strona jest przekierowana home.jsp Czy ktoś może mi powiedzieć, gdzie idę źle?

Edytuj:

Zmieniłem swój kod zgodnie z sugestią, ale nadal @after nie jest wykonany

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());
    }




}
1
Sumanth Jois 16 luty 2017, 10:36

2 odpowiedzi

Najlepsza odpowiedź

Masz dwa problemy z konfiguracją:

  • Wiosna nie wie nic o twoim aspekcie, musisz opisać go z jednym z adnotacji stereotypowych wiosny (np. @Component) lub zdefiniować go za pośrednictwem @Bean adnotacja w klasie WebConfig
  • W definicji pointcut jest literówka, jak wskazano pierwszym komentarzem :)
1
Patrick 16 luty 2017, 07:52

Klasa SignUpController nie implementuje interfejsu. Spróbuj umożliwić proxytargetclass w @enableaspectjautoproksy

@EnableAspectJAutoProxy(proxyTargetClass = true)
0
Hej 16 luty 2017, 07:49