2013-04-04 64 views
0

我有一個名爲com.sample.servlets.CreateReleaseServlet的servlet,我試圖在輔助方法中添加spring AOP通知。Java EE servlet作爲spring bean代理

我在Spring配置文件中的以下代碼:

<bean id="customerService" class="com.sample.servlets.CreateReleaseServlet"> 
</bean> 

<bean id="notificationAdvice" class="com.sample.advice.NotificationAdvice" /> 

<bean id="customerServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> 

    <property name="target" ref="customerService" /> 

    <property name="interceptorNames"> 
     <list> 
      <value>notificationAdvice</value> 
     </list> 
    </property> 
</bean> 

當我嘗試使用下面的Java代碼來獲得這個servlet豆:

ApplicationContext appContext = new ClassPathXmlApplicationContext(
     new String[] { "/WEB-INF/form-servlet.xml" }); 
CreateReleaseServlet servlet = (CreateReleaseServlet) appContext.getBean("customerServiceProxy"); 

String next = servlet.execute(req); 

我得到以下異常:

com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[CreateReleaseServlet]: java.lang.ClassCastException: $Proxy103 incompatible with com.sample.servlets.CreateReleaseServlet 
     at com.sample.servlets.CreateReleaseServlet.service(CreateReleaseServlet.java:1823) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) 
     at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1229) 
     at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774) 
     at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456) 
     at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97) 
     at com.sample.servlets.SampleFilter.doFilter(Unknown Source) 
     at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:928) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1025) 
     at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3751) 
     at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304) 
     at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:962) 
     at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662) 
     at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195) 
     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452) 
     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511) 
     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305) 
     at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83) 
     at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165) 
     at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 
     at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) 
     at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) 
     at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) 
     at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) 
     at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) 
     at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1690) 

任何建議將會很有幫助

回答

1

除非您啓用了類的代理(而不是接口的普通JdkProxy),否則這將不起作用,因爲代理對象不會充當您的servlet的子類。您可以將其轉換爲Servlet的實例。也就是說,你的方法看起來有點奇怪。你的攔截器是做什麼的?使用servlet執行AOP(ish)東西的常見方式是創建一個servlet過濾器。如果這不是一個選項,我建議你將你的servlet轉換爲Spring MVC控制器,並使用常規的Spring MVC選項來配置攔截器。

+0

我不知道該如何謝謝。你救了我很多麻煩。目前,我所做的是:1)用我從servlet的服務方法調用的方法創建一個接口(在我的例子中是執行方法)2)使servlet實現這個接口3)將getBean調用修改爲與新界面一起工作。 4)在界面上調用執行方法。如果沒有你的答覆,這又是不可能的。我讀過可以通過使用CGLib避免接口.http://insufficientinformation.blogspot.in/2007/12/spring-dynamic-proxies-vs-cglib-proxies.html – Sandeep 2013-04-04 08:26:45

+0

太棒了! :)但是我會考慮最終將其重構爲servlet過濾器或Spring MVC控制器。 – NilsH 2013-04-04 09:14:24