当前位置: 首页 > 知识库问答 >
问题:

未代理spring控制器

颛孙俊
2023-03-14

我有一个controller类,如下所示:

@Controller
class X extends BaseController{ 
    @RequestMapping()
    public String getX(){
    }
}

public class BaseController implements ServletContextAware {
}

我正在尝试添加一个方面,如下所示:

@Service
@Aspect
public class Foo{
   @Around("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
   public Object profileControllerAction(ProceedingJoinPoint pjp) 
                 throws Throwable {
      // do stuff
   }
}

但是,没有调用aspect方法。我期望它在调用控制器的getX()时执行。

我看到spring mvc没有用代理包装我的控制器bean。这就是为什么这方面没有效果的原因吗?

有没有人能解释一下我怎样才能让这个方面。

控制器类位于:com.xyz.webapp.controller中

Aspect类在com.xyz.webapp中

上下文文件位于WEB-INF中。
上下文xml为:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"          
    default-lazy-init="true">
    <context:annotation-config/>  
    <context:component-scan base-package="com.xyz"/>    
    <aop:aspectj-autoproxy />

    <aop:config>  
        <aop:advisor id="serivcesApiAdvice" advice-ref="serivcesAdvice" pointcut="execution(* *..provider.*.*(..))" order="1"/>        
    </aop:config>   
    <bean id="serivcesAdvice" class="com.xyz.webapp.spring.xyzMethodInterceptor"/>    
</beans>

-----更多细节----我在我们的一个控制器方法中添加了以下代码。实际上,我想它是在列出我们所有的豆子。如何才能在运行时看到应用程序中所有应用程序上下文的内容?

ApplicationContext context = ApplicationContextProvider.getApplicationContext();
System.out.println("context name:" + c.getDisplayName());
for(String s : context.getBeanDefinitionNames()){
    System.out.println(s);
}

它打印的上下文名称是:root WebApplicationContext

共有1个答案

暴向笛
2023-03-14

上下文中的方面配置仅应用于该上下文。它只能处理在那里声明的那些bean。

spring在其根上下文和servlet上下文之间使用父子关系。因此,上面表达的规则不适用。如果您希望为附加方面行为代理您的控制器,则需要将方面配置添加到扫描并生成@controllerbean的servlet上下文中。

注意,这看起来像是在进行冗余配置。您的(我假设)根上下文正在扫描应该由servlet上下文扫描的包(包含@controller类)。不要这样做,否则可能会出现两个bean或注入错误。

还有,

<context:annotation-config/>  

如果指定

<context:component-scan base-package="com.xyz"/>    

你可以摆脱它。

 类似资料:
  • 我是新来的Spring应用程序。我试图创建小Spring应用程序,但我得到404错误消息。似乎控制器(indexController)没有开始调用。我累了调试,但它不在那里。 文件位置: /WebContent/WEB-INF/pages/index.html /WebContent/WEB-INF/HelloWebServlet。xml /WebContent/WEB-INF/web.xml H

  • 我想在缓存控制头中设置max age以响应。我已经写了如下,但仍然有max-age 0。我想只为一种方法设置max age,所以我不想禁用默认值。我认为应该是ovveride。 有人知道我做错了什么吗?

  • 我有一个有一些订单的客户列表,我把他们都显示在一个表中。我添加了一个按钮,以便删除每个订单,如果需要的话。 当我试图删除一个特定的订单时,我会得到以下错误 未能将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;嵌套异常是java.lang.NumberFormatException:对于输入字符串:“{cid}(cid=${customer.id})”

  • 我在启动我的Weblogic管理服务器时看到以下错误: 我尝试在boot.properties中更改密码,但无法启动门户管理控制台。我还尝试通过删除boot.properties文件从控制台提供值,但仍然没有帮助。我需要提供

  • 我正在使用SpringMVC构建REST服务,现在我正在寻找一种从SpringMVC控制器内部将HTTP请求代理到外部REST服务的方法。 我正在获取HttpServletRequest对象,并希望代理它进行尽可能少的更改。对我来说最重要的是保持传入请求的所有头和属性不变。 我试图简单地发送另一个HTTP请求到外部资源使用RestTem板,但我未能找到复制请求属性的方法(这在我的情况下非常重要)。