2014-11-18 5 views
0

나는 스프링 웹 MVC를 사용하는 것을 받는다는 웹 응용 프로그램을하고 난 주요 응용 프로그램 @RequestMapping 어노테이션에 사용스프링 MVC와 OSGi - 새로운 컨트롤러를 등록하는 방법 - 두 번째 부분?

<context:component-scan 
     base-package="net.arturik.testosgispring.controllers" /> 
<mvc:annotation-driven /> 

MVC-디스패처-servlet.xml에있다. 모든 작업이 정상적으로 작동하며 컨트롤러는 @RequestMapping으로 올바르게 매핑됩니다. 괜찮아.

그러나 OSGi 번들에서 새 컨트롤러를 매핑하려고하면 hell이 ​​시작됩니다.

내 번들 코드는 다음과 같습니다

package net.arturik.testosgispring.controllers.q; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
public class C1 { 

    @RequestMapping(value = "/77777", method = RequestMethod.GET) 
    public ModelAndView getdata() { 

     ModelAndView model = new ModelAndView("index"); 

     return model; 

    } 

} 

디스패처-의 context.xml 파일의 내용이

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:security="http://www.springframework.org/schema/security" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-4.1.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-4.1.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-3.2.xsd"> 

    <context:annotation-config /> 
    <context:component-scan 
     base-package="net.arturik.testosgispring.controllers.q" annotation-config="true" /> 

    <bean name="/helloWorld.htm" 
      class="net.arturik.testosgispring.controllers.q.C1" /> 


    <mvc:annotation-driven /> 


</beans> 
이다 : 나는 URL에 매핑 원하는 컨트롤러의

package net.arturik.testosgibundle; 

import net.arturik.testosgispringlib.Vars; 
import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 

import org.osgi.util.tracker.ServiceTracker; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.FileSystemXmlApplicationContext; 

//@Configuration //Specifies the class as configuration 
//@ComponentScan("net.arturik.testosgibundle.controllers") //Specifies which package to scan 
//@EnableWebMvc //Enables to use Spring's annotations in the code 
public class Activator implements BundleActivator { 

    private static BundleContext context; 
    private ServiceTracker httpServiceTracker; 

    static BundleContext getContext() { 
     return context; 
    } 

    public void start(BundleContext context) throws Exception { 

     ApplicationContext applicationContext = new FileSystemXmlApplicationContext("k:\\myhostingpanel\\myhostingpanel\\Tests\\TestOSGIBundle\\src\\main\\resources\\dispatcher-context.xml"); 

     System.out.println("STARTING MODULE!!! 2"); 
     Vars.qqq = "!!!!"; 
    } 

코드,

번들을 활성화 할 때 오류가 발생했습니다.

18-Nov-2014 18:37:53.370 INFO [Thread-6] org.springframework.context.support.FileSystemXmlApplicationContext.prepareRefresh Refreshing org.[email protected]25796c7e: startup date [Tue Nov 18 18:37:53 MSK 2014]; root of context hierarchy 
18-Nov-2014 18:37:53.378 INFO [Thread-6] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions Loading XML bean definitions from file [k:\myhostingpanel\myhostingpanel\Tests\TestOSGIBundle\src\main\resources\dispatcher-context.xml] 
18-Nov-2014 18:37:53.452 WARNING [Thread-6] org.springframework.context.support.FileSystemXmlApplicationContext.refresh Exception encountered during context initialization - cancelling refresh attempt 
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [net.arturik.testosgispring.controllers.q.C1] for bean with name '/helloWorld.htm' defined in file [k:\myhostingpanel\myhostingpanel\Tests\TestOSGIBundle\src\main\resources\dispatcher-context.xml]; nested exception is java.lang.ClassNotFoundException: net.arturik.testosgispring.controllers.q.C1 
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1325) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:623) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:592) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1394) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:957) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:705) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140) 
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84) 
    at net.arturik.testosgibundle.Activator.start(Activator.java:25) 
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645) 
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2154) 
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2072) 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:976) 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:963) 
    at khartn.khartnosgiwrapper.OSGiLoader.installAndStartBundles(OSGiLoader.java:175) 
    at khartn.khartnosgiwrapper.OSGiLoader.start(OSGiLoader.java:90) 
    at net.arturik.testosgispring.OSGIThread.run(OSGIThread.java:34) 
Caused by: java.lang.ClassNotFoundException: net.arturik.testosgispring.controllers.q.C1 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1324) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1177) 
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:246) 
    at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:395) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1346) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1317) 
    ... 18 more 

Could not create framework: org.osgi.framework.BundleException: Activator start error in bundle net.arturik.TestOSGIBundle [1]. 
org.osgi.framework.BundleException: Activator start error in bundle net.arturik.TestOSGIBundle [1]. 
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2204) 
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2072) 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:976) 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:963) 
    at khartn.khartnosgiwrapper.OSGiLoader.installAndStartBundles(OSGiLoader.java:175) 
    at khartn.khartnosgiwrapper.OSGiLoader.start(OSGiLoader.java:90) 
    at net.arturik.testosgispring.OSGIThread.run(OSGIThread.java:34) 
Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [net.arturik.testosgispring.controllers.q.C1] for bean with name '/helloWorld.htm' defined in file [k:\myhostingpanel\myhostingpanel\Tests\TestOSGIBundle\src\main\resources\dispatcher-context.xml]; nested exception is java.lang.ClassNotFoundException: net.arturik.testosgispring.controllers.q.C1 
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1325) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:623) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:592) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1394) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:957) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:705) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140) 
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84) 
    at net.arturik.testosgibundle.Activator.start(Activator.java:25) 
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645) 
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2154) 
    ... 6 more 
Caused by: java.lang.ClassNotFoundException: net.arturik.testosgispring.controllers.q.C1 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1324) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1177) 
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:246) 
    at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:395) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1346) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1317) 

왜 스프링이 OSGI 번들 패키지에서 net.arturik.testosgispring.controllers.q.C1 클래스를 찾을 수 없습니까? 또한 매니페스트의 내보내기에있는 패키지는 다음과 같습니다.

Export-Package: net.arturik.testosgibundle;uses:="org.osgi.framework,org 
.springframework.context.support,net.arturik.testosgispringlib,org.osgi 
.util.tracker";version="1.0.0.SNAPSHOT",net.arturik.testosgibundle.cont 
rollers;uses:="org.springframework.web.servlet,org.springframework.ster 
eotype,org.springframework.web.bind.annotation";version="1.0.0.SNAPSHOT 
",net.arturik.testosgispring.controllers.q;uses:="org.springframework.w 
eb.servlet,org.springframework.stereotype,org.springframework.web.bind. 
annotation";version="1.0.0.SNAPSHOT" 
Import-Package: net.arturik.testosgispringlib,org.osgi.framework;version 
="[1.7,2)",org.osgi.util.tracker;version="[1.5,2)",org.springframework. 
context.support,org.springframework.stereotype,org.springframework.web. 
bind.annotation,org.springframework.web.servlet 

답변

1

스프링 패키지로 별도의 번들을 만들었거나 어딘가에서 가져온 것처럼 보입니다. 결과적으로 FileSystemXmlApplicationContext 클래스를 포함하는 번들의 클래스 경로는 로컬 클래스를 볼 수 없습니다. 따라서 ClasssNotFoundException.

물론 컨텍스트를 만들기 전에 번들 클래스 로더를 스레드로 설정하여 클래스 로더를 조정할 수는 있지만 스프링/OSGi 조합에서 멀리 이동하는 것이 좋습니다.

스프링 (더 구체적으로 : 모든 숨겨진 마술을 가진 이후 버전)과 OSGi는 실제로 함께 작동하지 않습니다. 이것은 일반적으로 알려져 있으며 그 이유는 질문에 대한 많은 답변을 얻지 못하는 이유입니다. 나를 믿으십시오, 당신은 많은 어려움을 야기 할 길을 가고 있으며 막 다른 길을 걷게 될 것 같습니다.

의 경우을 사용해야하는 경우 Apache Karaf와 같은 추가 컨테이너를 사용하는 것이 가장 좋습니다. 나는 그것을 사용하지 않지만 다른 사람들이 그걸 가지고 약간의 성공을했다는 것을 알고있다.