2017-02-23 16 views
0

스프링 MVC 포틀릿에서 서비스 빌더 모듈 프로젝트를 통해 생성 된 서비스에 액세스하는 중 문제가 발생했습니다. 포럼 링크 https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/service-trackers을 읽고 서비스 트래커를 사용하려고했습니다. 컨트롤러에서 서비스에 액세스합니다. Liferay 7 (DXP) 스프링 MVC 포틀릿, 서비스 빌더 생성 서비스 액세스 문제

여기에 스프링 MVC 포틀릿의 배포 과정, 문제 아래에 직면 SpringTestPortletViewController.java

@Controller 
@RequestMapping("VIEW") 
public class SpringTestPortletViewController { 

    private FooServiceTracker fooServiceTracker; 
    @PostConstruct 
    public void init(){ 
     fooServiceTracker=new FooServiceTracker(this); 
     fooServiceTracker.open(); 
    } 
    @PreDestroy public void destroy(){ 
     fooServiceTracker.close(); 
    } 

    @RenderMapping 
    public String question(Model model) { 
     try { 
      if(!fooServiceTracker.isEmpty()){ 
       FooLocalService fooLocalService=fooServiceTracker.getService(); 
       fooLocalService.saveFoo(); 
       System.out.println("----" + FooLocalServiceUtil.getFoosCount()); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return "SpringTest/view"; 
    } 
} 

FooServiceTracker.java

public class FooServiceTracker extends ServiceTracker<FooLocalService,FooLocalService>{ 

    public FooServiceTracker(Object host){ 
     super(FrameworkUtil.getBundle(host.getClass()).getBundleContext(), FooLocalService.class, null); 
    } 
} 

입니다. 그것은 번들 얻을 수 없습니다 즉 FrameworkUtil.getBundle(SpringTestPortletViewController.getClass())

11:49:48,432 INFO [Refresh Thread: Equinox Container: 6095db50-baf9-0016-1a03-97f126c9b821][PortletHotDeployListener:202] Registering portlets for SpringTest-portlet 
11:49:48,649 ERROR [Refresh Thread: Equinox Container: 6095db50-baf9-0016-1a03-97f126c9b821][DispatcherPortlet:279] Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springTestPortletViewController': Invocation of init method failed; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.web.portlet.FrameworkPortlet.createPortletApplicationContext(FrameworkPortlet.java:368) 
    at org.springframework.web.portlet.FrameworkPortlet.initPortletApplicationContext(FrameworkPortlet.java:297) 
    at org.springframework.web.portlet.FrameworkPortlet.initPortletBean(FrameworkPortlet.java:271) 
    at org.springframework.web.portlet.GenericPortletBean.init(GenericPortletBean.java:124) 
    at javax.portlet.GenericPortlet.init(GenericPortlet.java:136) 
    at com.liferay.portlet.InvokerPortletImpl.init(InvokerPortletImpl.java:296) 
    at com.liferay.portlet.PortletInstanceFactoryImpl.init(PortletInstanceFactoryImpl.java:294) 
    at com.liferay.portlet.PortletInstanceFactoryImpl.create(PortletInstanceFactoryImpl.java:193) 
    at com.liferay.portal.kernel.portlet.PortletInstanceFactoryUtil.create(PortletInstanceFactoryUtil.java:49) 
    at com.liferay.portlet.PortletBagFactory.create(PortletBagFactory.java:217) 
    at com.liferay.portal.service.impl.PortletLocalServiceImpl.initWAR(PortletLocalServiceImpl.java:858) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:153) 
    at com.liferay.portal.spring.aop.ServiceBeanAopProxy.invoke(ServiceBeanAopProxy.java:174) 
    at com.sun.proxy.$Proxy123.initWAR(Unknown Source) 
    at com.liferay.portal.kernel.service.PortletLocalServiceUtil.initWAR(PortletLocalServiceUtil.java:327) 
    at com.liferay.portal.deploy.hot.PortletHotDeployListener.doInvokeDeploy(PortletHotDeployListener.java:210) 
    at com.liferay.portal.deploy.hot.PortletHotDeployListener.invokeDeploy(PortletHotDeployListener.java:95) 
    at com.liferay.portal.deploy.hot.HotDeployImpl.doFireDeployEvent(HotDeployImpl.java:237) 
    at com.liferay.portal.deploy.hot.HotDeployImpl.fireDeployEvent(HotDeployImpl.java:104) 
    at com.liferay.portal.kernel.deploy.hot.HotDeployUtil.fireDeployEvent(HotDeployUtil.java:28) 
    at com.liferay.portal.kernel.servlet.PluginContextListener.fireDeployEvent(PluginContextListener.java:164) 
    at com.liferay.portal.kernel.servlet.PluginContextListener.doPortalInit(PluginContextListener.java:154) 
    at com.liferay.portal.kernel.util.BasePortalLifecycle.portalInit(BasePortalLifecycle.java:44) 
    at com.liferay.portal.kernel.util.PortalLifecycleUtil.register(PortalLifecycleUtil.java:74) 
    at com.liferay.portal.kernel.util.PortalLifecycleUtil.register(PortalLifecycleUtil.java:58) 
    at com.liferay.portal.kernel.util.BasePortalLifecycle.registerPortalLifecycle(BasePortalLifecycle.java:54) 
    at com.liferay.portal.kernel.servlet.PluginContextListener.contextInitialized(PluginContextListener.java:116) 
    at com.liferay.portal.kernel.servlet.SecurePluginContextListener.contextInitialized(SecurePluginContextListener.java:151) 
    at com.liferay.portal.osgi.web.wab.extender.internal.adapter.ServletContextListenerExceptionAdapter.contextInitialized(ServletContextListenerExceptionAdapter.java:51) 
    at sun.reflect.GeneratedMethodAccessor487.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.eclipse.equinox.http.servlet.internal.registration.ListenerRegistration$EventListenerInvocationHandler.invoke(ListenerRegistration.java:132) 
    at com.sun.proxy.$Proxy491.contextInitialized(Unknown Source) 
    at org.eclipse.equinox.http.servlet.internal.context.ContextController.doAddListenerRegistration(ContextController.java:359) 
    at org.eclipse.equinox.http.servlet.internal.context.ContextController.addListenerRegistration(ContextController.java:312) 
    at org.eclipse.equinox.http.servlet.internal.customizer.ContextListenerTrackerCustomizer.addingService(ContextListenerTrackerCustomizer.java:67) 
    at org.eclipse.equinox.http.servlet.internal.customizer.ContextListenerTrackerCustomizer.addingService(ContextListenerTrackerCustomizer.java:1) 
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941) 
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1) 
    at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) 
    at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) 
    at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:901) 
    at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:917) 
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) 
    at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) 
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:862) 
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:801) 
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:127) 
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:225) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:464) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:482) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:1001) 
    at com.liferay.portal.osgi.web.wab.extender.internal.WabBundleProcessor.initListeners(WabBundleProcessor.java:526) 
    at com.liferay.portal.osgi.web.wab.extender.internal.WabBundleProcessor.init(WabBundleProcessor.java:153) 
    at com.liferay.portal.osgi.web.wab.extender.internal.WebBundleDeployer._initWabBundle(WebBundleDeployer.java:186) 
    at com.liferay.portal.osgi.web.wab.extender.internal.WebBundleDeployer.doStart(WebBundleDeployer.java:106) 
    at com.liferay.portal.osgi.web.wab.extender.internal.WabFactory$WABExtension.start(WabFactory.java:163) 
    at org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:259) 
    at org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:232) 
    at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482) 
    at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:1) 
    at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) 
    at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:905) 
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) 
    at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) 
    at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:165) 
    at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:75) 
    at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:67) 
    at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:102) 
    at org.eclipse.osgi.container.Module.publishEvent(Module.java:461) 
    at org.eclipse.osgi.container.Module.start(Module.java:452) 
    at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:454) 
    at org.eclipse.osgi.container.ModuleContainer.applyDelta(ModuleContainer.java:717) 
    at org.eclipse.osgi.container.ModuleContainer.resolveAndApply(ModuleContainer.java:491) 
    at org.eclipse.osgi.container.ModuleContainer.resolve(ModuleContainer.java:437) 
    at org.eclipse.osgi.container.ModuleContainer.refresh(ModuleContainer.java:955) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerWiring.dispatchEvent(ModuleContainer.java:1336) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerWiring.dispatchEvent(ModuleContainer.java:1) 
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) 
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340) 
Caused by: java.lang.NullPointerException 
    at com.service.tracker.FooServiceTracker.<init>(FooServiceTracker.java:11) 
    at SpringTest.SpringTestPortletViewController.init(SpringTestPortletViewController.java:43) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:354) 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:305) 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133) 
    ... 98 more 

는 여기에 몇 가지 입력 감사합니다 널오고있다

+0

이 게시물을 따르는 사람이라면 https://web.liferay.com/community/forums/-message_boards/message/86461097 –

답변

0

FrameworkworkUtil 구현 클래스를로드 할 OSGI 런타임에 의존한다. 귀하의 클래스가 OSGi 번들 클래스 로더에 의해로드되지 않았고 대신 AppClassLoader에로드되었다고 생각합니다. getBundle은 OSGI 클래스 로더를 통해로드 된 클래스 만 반환하므로 NULL을 반환합니다. OSGI 런타임 구성에 대한 자세한 내용은 org.osgi.framework.launch.FrameworkFactory 문서를 참조하십시오.

+0

에 동의하는 응답을 찾을 수도 있지만 https :// /dev.liferay.com/develop/tutorials--/knowledge_base/7-0/service-trackers. 나는 Spring MVC 포틀릿에서 jar 생성 서비스 빌더의 의존성을 해결할 방법을 찾고 있었다. –

0

Tomcat/lib/ext에있는 서비스 빌더 모듈 api jars를 이동하여 서버를 다시 시작한 다음 작동 한 Spring MVC 포틀릿에서 Util 클래스에 액세스했습니다. 스프링 MVC 포틀릿에서 서비스 빌더 모듈 jar의 이러한 종속성을 처리하기위한 모범 사례를 보려면 여기를 참조하십시오.

0

필자가 경험 한 일반적인 관행은 tomcat/lib/아래에 커스텀 사용자 서비스와 같은 일반적인 서비스 빌더 jar를 유지하고 포틀릿의 WEB-INF/lib /에서 포틀릿 특정 서비스 빌더 jar를 유지하는 것이었다. 또한 빌더 jar를 공유 할 필요가있는 경우, 여전히 포틀릿 WEB-INF/lib에 넣고 required-deployment-contexts을 사용하여 다른 포틀릿 컨텍스트의 jar를 참조하십시오.

+0

감사합니다. 6.2까지는 작동하지만 포틀릿의 WEB-INF/lib /에 모듈 jar를 넣거나 필수 배치 컨텍스트를 사용하여 DXP Spring MVC 포틀릿에서 모듈 api 프로젝트 작업을 지정합니까? 스프링 포틀릿, 즉 서비스 빌더를위한 WAB와 OSGi 모듈의 컨텍스트가 다릅니 까? –