2013-04-04 4 views
0

У меня есть сервлет с именем com.sample.servlets.CreateReleaseServlet, для которого я пытаюсь добавить весенний совет AOP в вспомогательном методе.Java EE servlet as spring bean proxy

У меня есть следующий код в весеннем конфигурационном файле:

<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-код:

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. Тем не менее, ваш подход кажется немного странным. Что делает ваш перехватчик? Общим способом создания файлов AOP (ish) с сервлетами является создание фильтра сервлета. И если это не вариант, я предлагаю вам преобразовать ваш сервлет в контроллер Spring MVC и использовать обычные параметры Spring MVC для настройки перехватчиков.

+0

Я не знаю, как поблагодарить вас. Ты спас меня от множества неприятностей. В настоящее время я сделал следующее: 1) Создайте интерфейс с методами, которые я вызываю из сервисного метода сервлета (метод execute в моем случае). 2) Сделайте сервлет реализацией этого интерфейса. 3) Измените вызов getBean на работать с новым интерфейсом. 4) Вызовите метод выполнения на интерфейсе. Снова это было бы невозможно без вашего ответа. Я прочитал, что можно избежать интерфейсов с помощью CGLib .http: //inscessinformation.blogspot.in/2007/12/spring-dynamic-proxies-vs-cglib-proxies.html – Sandeep

+0

Отлично! :) Но я бы подумал о реорганизации его в фильтр сервлетов или контроллер Spring MVC. – NilsH