2011-11-22 58 views
3

我已经为aop做了注释。当我用任何方法而不是控制器方法使用它时,它运行良好。但是,当我在我的控制器的方法中使用它时,我的控制器停止工作。它开始给映射404找不到错误。我在这里发现了一个类似的问题:Spring 3 MVC @Controller with AOP interceptors?但我不知道该怎么做。我在我的控制方法是:在弹簧控制器上的Aop注释不起作用

@WebAuditable // This is my annotation that works at other methods 
@Override 
@RequestMapping(value = "/ad", method = RequestMethod.POST, headers = "Accept=application/json") 
public 
@ResponseBody 
Cd create(HttpServletResponse response, @RequestBody Cd cd) { 
    ... 
} 

我的,我的控制器实现接口是:

public interface BaseController<T> { 

    public List<T> getAll(HttpServletResponse response); 

    public T getByName(HttpServletResponse response, String id); 

    public T create(HttpServletResponse response, T t); 

    public T update(HttpServletResponse response, T t); 

} 

有何意见?

PS: @SeanPatrickFloyd说:

注意当使用控制器接口(如AOP代理),使 一定要始终把你所有的映射注解 - 如 @RequestMapping和@SessionAttributes - 控制器接口 上,而不是在实现类

回答

3

的事情是:控制器映射在运行时完成的,如果你使用AOP代理,公关oxy对象在运行时没有注释,只有它们的接口可以。我可以想出两个可能的策略来解决这个限制。

要么注释通用接口方法,要么为(如果您不想通知所有控制器)为每个实现类型创建一个子接口,明确注释它们的方法。我知道这是很多重写的代码,与AOP的内容相反,但我坚持使用基于接口的代理时不知道更好的方法。

另一种方法是使用proxy-target-class =“true”切换到CGLib代理。这样代理类应该(我不确定这一点)保留注释。

更新:注释你的界面应该像这样(如果它工作)

public interface BaseController<T> { 

    @WebAuditable 
    public List<T> getAll(HttpServletResponse response); 

    @WebAuditable 
    public T getByName(HttpServletResponse response, String id); 

    @WebAuditable 
    public T create(HttpServletResponse response, T t); 

    @WebAuditable 
    public T update(HttpServletResponse response, T t); 

} 

注解基类是行不通的,因为JDK代理不公开,这不是由接口支持的任何信息。

+0

感谢您的帮助。我将如何注释通用方法,你能告诉我一个例子吗?有一个基础控制器接口,我的所有控制器都实现它。 (实际上有一个实现BaseController的抽象类,但没有实现它的create updatede删除方法,控制器实现它们)。那么我可以通过注释我的BaseController来解决这个问题吗?我怎么能注释它可以显示我的问题? – kamaci

+0

@kamaci看到我的更新 –

+0

我试过了,但没有注解那个接口。我找不到任何方法来做到这一点。你的第二个建议怎么样? – kamaci