【发布时间】:2016-08-30 01:17:39
【问题描述】:
我创建了一个 Spring 网站。 我使用了一个抽象的通用控制器类,具有不同的实现。 如果我不在任何控制器上激活 Aspect 类,它会很好地工作。
如果我激活了一个方面,那么所有的映射似乎都被停用了:
调试:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 未找到 [/contact/2] 的处理程序方法
警告:org.springframework.web.servlet.PageNotFound - 在名为“appServlet”的 DispatcherServlet 中找不到带有 URI [/clubhelperbackend/contact/2] 的 HTTP 请求的映射
这是我的抽象控制器:
public abstract class AbstractController<T extends Data> implements ClubController<T> {
protected Dao<T> dao;
private Class<T> elementClass;
public AbstractController(Dao<T> dao, Class<T> element) {
super();
this.dao = dao;
this.elementClass = element;
}
@Override
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getAsView(@PathVariable("id") long id, @RequestParam(required = false) boolean ajax, Model m) {
String mapping = elementClass.getSimpleName();
m.addAttribute(mapping, getById(id));
return mapping + "Get" + (ajax ? "Ajax" : "");
}
@Override
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE, produces = "application/json")
public T delete(@PathVariable("id") long id) {
T obj = getById(id);
// dao.delete(id);
return obj;
}
}
还有一个实现:
@Controller
@RequestMapping("/contact")
public class ContactController extends AbstractController<Contact> {
@Autowired
public ContactController(Dao<Contact> contactDao) {
super(contactDao, Contact.class);
}
}
这是我的观点:
@Aspect
@Component
public class DeletedStorageAspect {
//
// private DeletedEntriesDao deletedEntriesDao;
//
// @Autowired
// public DeletedStorageAspect(DeletedEntriesDao deletedEntriesDao) {
// super();
// this.deletedEntriesDao = deletedEntriesDao;
// }
@Pointcut("execution (public * de.kreth.clubhelperbackend.controller.abstr.AbstractController.delete(..))")
private void invocation() {
}
@AfterReturning(pointcut = "invocation()", returning = "deleted")
public void storeDeleted(JoinPoint joinPoint, Data deleted) {
System.out.println("Deleted: " + deleted);
String tableName = deleted.getClass().getSimpleName();
long id = deleted.getId();
Date now = new Date();
DeletedEntries entry = new DeletedEntries(-1L, tableName, id, now, now);
System.out.println(entry);
// deletedEntriesDao.insert(entry);
}
}
这是我的 beans.xml 的一部分:
<aop:aspectj-autoproxy>
<aop:include name="mysqlDbCheckAspect" />
<aop:include name="daoLoggerAspect" />
<aop:include name="controllerSecurityAspect" />
<aop:include name="deletedStorageAspect" />
</aop:aspectj-autoproxy>
我可以通过评论 deletedStorageAspect 来恢复全部功能。
是什么导致了这种行为?为什么映射无法识别它们的方面?控制器上是否不允许使用方面?
希望得到一些帮助。
【问题讨论】:
-
见docs.spring.io/spring/docs/current/spring-framework-reference/…。简而言之,将
proxy-target-class=true添加到<aop:aspectj-autoproxy />。 -
@M.Deinum:就是这样!谢谢你。我不太明白它的作用。如果您在答案中解释,我接受。
标签: java spring aop spring-aop