gpt4 book ai didi

java - Spring MVC 与 OSGi - 如何注册新 Controller - 第二部分?

转载 作者:行者123 更新时间:2023-12-01 12:16:12 25 4
gpt4 key购买 nike

我有 Maven Web 应用程序,使用了 Spring Web MVC,并且我在主应用程序中使用了 @RequestMapping 注释和

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

在 mvc-dispatcher-servlet.xml 中。一切正常, Controller 正确映射@RequestMapping。没关系。

但是当我尝试从 OSGi 包映射新 Controller 时, hell 就开始了。

我的捆绑代码是:

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 = "!!!!";
}

Controller 的代码,我想要映射到 URL:

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;

}

}

dispatcher-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>

激活 bundle 时出现错误:

18-Nov-2014 18:37:53.370 INFO [Thread-6] org.springframework.context.support.FileSystemXmlApplicationContext.prepareRefresh Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@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)

为什么Spring无法从OSGI bundle 中找到类net.arturik.testosgispring.controllers.q.C1?包也包含在 list 中的导出中:

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

最佳答案

看来您使用 Spring 内容创建了一个单独的包,或者从某个地方获取了它。因此,包含 FileSystemXmlApplicationContext 类的包的类路径无法看到您的本地类。因此出现了ClasssNotFoundException

您当然可以调整类加载器,例如在创建上下文之前将捆绑类加载器设置到线程,但我强烈建议放弃 Spring/OSGi 组合。

Spring(更具体地说:具有所有隐藏魔法的更高版本)和 OSGi 并不能真正协同工作。这是众所周知的,这就是为什么您的问题没有得到太多答复的原因。相信我,你正走在一条会带来很多困难并且很可能有死胡同的路上。

如果您必须使用该组合,那么您最好使用其他容器,例如 Apache Karaf。我不使用它,但我知道其他人已经取得了一些成功。

关于java - Spring MVC 与 OSGi - 如何注册新 Controller - 第二部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26997069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com