2015-05-18 2 views
0

У меня есть веб-приложение с использованием Spring, Apache CXF и Jetty. Spring не нравится добавление аннотации под названием @Loggable к методам в одном из моих классов.BeanCreationException из Spring с аннотацией «@Context» и «@Loggable»

Во-первых, аннотаций @Loggable ссылки на класс LogAspect, который регистрирует сообщения запросов и ответов:

@Aspect 
@Component 
public class LogAspect { 

    ... 
    ... 
     @Around("execution(* * (..)) && @annotation(Loggable)") 
     public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { 

      ... 
      if (returnValue != null) { 
       logger.infoRequestResponse(clazz, name, joinPoint.getArgs(), returnValue); 
      } else { 
       logger.infoRequestResponse(clazz, name, joinPoint.getArgs(), "void"); 
      } 
      return returnValue; 
     } 
} 

Я предполагаю, что это что-то делать с @Context -annotation, и что впрыскивается при ,

Класс - это реализация службы RESTful. Частный член request имеет аннотацию @Context на нем:

@org.springframework.stereotype.Service(value = "resellerService") 
public class ResellerServiceImpl implements ResellerService { 

    @Context 
    private HttpServletRequest request; 
... 
... 
    @Loggable 
    @Override 
    public Response isUserLoggedIn() { 
     Optional<ResellerSession> maybeSession = getSessionFromContext(); 
     return Response.ok(maybeSession.isPresent()).build(); 
    } 

Добавление @Loggable -annotation на методе isUserLoggedIn дает мне следующее исключение:

 WARN org.eclipse.jetty.webapp.WebAppContext - Failed startup of context [email protected]{/,file:/home/lars/intellij_wspace/app/app-node/trunk/src/main/webapp/,STARTING}{src/main/webapp/} 
     org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resellerServiceServer': Invocation of init method failed; nested exception is org.apache.cxf.service.factory.ServiceConstructionException 
      at [SNIP] 
    org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349) ~[jetty-webapp-9.2.10.v20150310.jar:9.2.10.v20150310] 
      at ] 
[SNIP] 
     Caused by: org.apache.cxf.service.factory.ServiceConstructionException: null 
      at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:219) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_80] 
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_80] 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_80] 
      at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_80] 
      at 
    [SNIP] 
      ... 33 common frames omitted 
     Caused by: java.lang.IllegalArgumentException: Can not set javax.servlet.http.HttpServletRequest field com.app.service.impl.reseller.ResellerServiceImpl.request to com.sun.proxy.$Proxy109 
      at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) ~[na:1.7.0_80] 
      at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) ~[na:1.7.0_80] 
      at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55) ~[na:1.7.0_80] 
      at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75) ~[na:1.7.0_80] 
      at java.lang.reflect.Field.set(Field.java:741) ~[na:1.7.0_80] 
      at org.apache.cxf.jaxrs.utils.InjectionUtils$1.run(InjectionUtils.java:192) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
      at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_80] 
      at org.apache.cxf.jaxrs.utils.InjectionUtils.injectFieldValue(InjectionUtils.java:188) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
      at org.apache.cxf.jaxrs.utils.InjectionUtils.injectContextProxiesAndApplication(InjectionUtils.java:1058) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
      at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.injectContexts(JAXRSServerFactoryBean.java:405) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
      at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.updateClassResourceProviders(JAXRSServerFactoryBean.java:429) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
      at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:162) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 

Так что я попытался забирая @Context по запросу и вместо этого добавьте его к методу сеттера:

private HttpServletRequest request; 

@Context 
public void setRequest(HttpServletRequest request) { this.request = request; } 

, который дает мне это исключение:

WARN org.eclipse.jetty.webapp.WebAppContext - Failed startup of context [email protected]{/,file:/home/lars/intellij_wspace/app/app-node/trunk/src/main/webapp/,STARTING}{src/main/webapp/} 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resellerServiceServer': Invocation of init method failed; nested exception is org.apache.cxf.service.factory.ServiceConstructionException 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) ~[spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) ~[spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    ... 
    ... 
Caused by: org.apache.cxf.service.factory.ServiceConstructionException: null 
    at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:219) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_80] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_80] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_80] 
    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_80] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1702) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1641) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    ... 33 common frames omitted 
Caused by: javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error 
    at org.apache.cxf.jaxrs.utils.SpecExceptions.toInternalServerErrorException(SpecExceptions.java:79) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at org.apache.cxf.jaxrs.utils.ExceptionUtils.toInternalServerErrorException(ExceptionUtils.java:106) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at org.apache.cxf.jaxrs.utils.InjectionUtils.reportServerError(InjectionUtils.java:472) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at org.apache.cxf.jaxrs.utils.InjectionUtils.reportServerError(InjectionUtils.java:458) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at org.apache.cxf.jaxrs.utils.InjectionUtils.injectThroughMethod(InjectionUtils.java:314) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at org.apache.cxf.jaxrs.utils.InjectionUtils.injectThroughMethod(InjectionUtils.java:294) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at org.apache.cxf.jaxrs.utils.InjectionUtils.injectContextProxiesAndApplication(InjectionUtils.java:1046) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.injectContexts(JAXRSServerFactoryBean.java:405) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.updateClassResourceProviders(JAXRSServerFactoryBean.java:429) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:162) ~[cxf-rt-frontend-jaxrs-3.1.0.jar:3.1.0] 
    ... 40 common frames omitted 

У кого-нибудь есть идеи, как это решить?

EDIT

Я не могу показать всю свою pom.xml, но у меня есть эта линия 4.1.6.RELEASE

И сборка выглядит и работает отлично. Все остальные аннотации, такие как @Autowired, работают нормально.

+0

Возможно, это связано с базовым проксированием, выполняемым АОП. Я имею в виду, что это ясно видно в первой ошибке. –

+0

можно добавить свой pom.xml вместе с этим вопросом –

ответ

0

Теперь я получил помощь в решении этой проблемы. Короче говоря, аннотацию @Context пришлось перенести в метод интерфейса, который реализовал класс.

Решение заключается в следующем:

  1. Удален частный член HttpServletRequest request и его @Context аннотации.
  2. Добавьте параметр HttpServletRequest в качестве параметров методам, которые его используют. Пример:

    общественности registerUser Response (HttpServletRequest запрос, ...) {

  3. Добавьте @Context аннотацию к интерфейсу REST вместо этого. Пример:

    @Path ("Регистр/пользователя")
    @POST
    @Consumes ("Применение/JSON")

    отклика registerUser (@Context HttpServletRequest HttpServletRequest, ..);

0

Проблема с spring-beans-4.1.6.RELEASE.jar.

Надеюсь, что вы добавили Spring-beans-4.1.6.jar файл Still Spring иногда не может получить банку из-за некоторых проблем. В этом случае

Удалите уже существующий проект с вашего сервера.

правой кнопкой мыши сервер,

Нажмите чистую,

Щелкните правой кнопкой мыши сервер,

Нажмите ясно каталог Рабочая.

Spring MVC Можно также принести банку файлы таким образом, оно работает

Щелкните правой кнопкой мыши проект Spring MVC,

Путь сборки -> Настройка сборки Путь

вкладка появится,

Выберите Добавить внешнюю кнопку JAR и добавьте все банки, которые вы хотите.

После этого нажмите ассамблею развертывания,

Нажмите кнопку Добавить кнопку,

Нажмите записи Java Build Path,

Нажмите кнопку Далее,

Выберите все банки, которые появляются на этом окне ,

Нажмите «Готово».

Обновить проект,

Запустить проект.

В настоящее время он правильно доставит весенние бобы-4.1.6.RELEASE.jar. Надеюсь, поможет.

+0

Спасибо за ответ, но я не думаю, что это причина проблемы. У меня есть «Maven: org.springframework: spring-beans: 4.1.6.RELEASE» в моих библиотеках проектов. –

+0

это прекрасно работает с maven..if проблема с ухом не решена .. u может попробовать. –

Смежные вопросы