Pessoal, estou com um problema com aspectos. É a primeira vez q trabalho com aspectos no Spring.
Eu tenho a seqguinte classe onde defino meus aspectos:
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class Log {
@Pointcut("execution(* dao.UserDB2.insert(..))")
public void save(){}
@Pointcut("execution(* controllers.AjaxCrudController.removeUser(..))")
public void remove(){}
@After("save()")
public void WriteUserCreationLog(){
System.out.println("######## An user was added!");
}
@After("remove()")
public void WriteUserRemovalLog(){
System.out.println("######## An user was removed!");
}
}
Como teste, eu coloquei um deles em um método de um controller, e outro no método do meu DAO.
O Aspecto que olha o método de meu controller funciona tranquilo (AjaxCrudController.removeUser), mas o outro, que olha o método do DAO, não funciona de jeito nenhhum.
Segue meu controller:
@Controller
@RequestMapping("/ajaxCrud")
public class AjaxCrudController {
@RequestMapping(value="/saveUser",method=RequestMethod.POST)
public void saveUser(HttpServletRequest request, HttpServletResponse response) throws IOException{
Map<String, String> json = new HashMap<String, String>();
try{
UserDAO udao = (UserDAO) ContextLoaderListener.getCurrentWebApplicationContext().getBean("userDAO");
boolean exists = true;
User user = new User();
try{
user = udao.findByIntranetidDeleted(intranetid);
}catch(EmptyResultDataAccessException e){
exists = false;
}
user.setName(request.getParameter("name"));
user.setIntranetid(request.getParameter("intranetid"));
user.setDeleted("N");
if(exists){
ret = udao.update(user);
System.out.println("Update");
json.put("message", "User updated successfully.");
}else{
ret = udao.insert(user);
System.out.println("insert");
json.put("message", "User created successfully. ");
}
json.put("status", "ok");
}catch(Exception e){
json.put("status", "error");
json.put("message", e.getMessage());
}
Gson gson = new GsonBuilder().create();
response.getWriter().append(gson.toJson(json));
}
@RequestMapping(value="/removeUser",method=RequestMethod.POST)
public void removeUser(HttpServletRequest request, HttpServletResponse response) throws IOException{
Map<String, String> json = new HashMap<String, String>();
try{
Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonArray jsonArray = parser.parse(request.getParameter("ids")).getAsJsonArray();
List<User> userList = new ArrayList<User>();
for(JsonElement element : jsonArray){
int id = gson.fromJson(element, Integer.class);
User user = new User();
user.setId(id);
userList.add(user);
}
UserDAO udao = (UserDAO) ContextLoaderListener.getCurrentWebApplicationContext().getBean("userDAO");
udao.batchRemove(userList);
json.put("status", "ok");
json.put("message", "Users deleted successfully.");
}catch(Exception e){
json.put("status", "error");
json.put("message", e.getMessage());
}
Gson gson = new GsonBuilder().create();
response.getWriter().append(gson.toJson(json));
}
}
Segue minha interface e classe DAO:
import java.util.List;
public interface UserDAO {
List<User> findAllUsers();
User findById(int id);
User findByIntranetid(String intranetid);
List<User> findAllByFilter(String intranetid);
int update(User user);
int insert(User user);
void batchRemove(List<User> list);
User findByIntranetidDeleted(String intranetid);
}
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.stereotype.Component;
@Component
public class UserDB2 extends NamedParameterJdbcDaoSupport implements UserDAO {
private final String INSERT = "INSERT INTO DB.USER (NAME,INTRANETID,DELETED) VALUES (:name,:intranetid,'N')";
private final String UPDATE = "UPDATE DB.USER SET NAME = :name, INTRANETID = :intranetid,DELETED = :deleted WHERE ID = :id";
public UserDB2(DriverManagerDataSource dataSource){
this.setDataSource(dataSource);
}
@Override
public int update(User user) {
MapSqlParameterSource map = new MapSqlParameterSource();
map.addValue("name", user.getName());
map.addValue("intranetid", user.getIntranetid());
map.addValue("id", user.getId());
map.addValue("deleted", user.getDeleted());
return getNamedParameterJdbcTemplate().update(this.UPDATE, map);
}
@Override
public int insert(User user) {
GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
MapSqlParameterSource map = new MapSqlParameterSource();
map.addValue("name", user.getName());
map.addValue("intranetid", user.getIntranetid());
getNamedParameterJdbcTemplate().update(this.INSERT, map,generatedKeyHolder);
return generatedKeyHolder.getKey().intValue();
}
Eu adicionei os pacotes de aspectos e interfaces no component-scan, e adicionei o <aop:aspectj-autoproxy /> no meu arquivo de config, alem de criar o bean com a classe do Log,
A aplicacão funciona, o cadastro de usuários está ok, as views, os daos, estão todos ok.
Tentei instanciar o DAO sem usar o getBean do Spring, mas também não funcionou.
Alguém teria alguma dica?
Vlw!
OBS: Alguns códigos podem parecer inconsistentes, mas precisei omitir coisas, devido a politicas da empresa.