jfinal和spring整合问题

hongflyfly 发布于 2016/01/27 10:21
阅读 1K+
收藏 1

@JFinal 你好,想跟你请教个问题:我用jfinal2.2整合spring的时候,由于是老项目用的spring版本比较老,是2.5.6的,spring的xml文件无法被spring解析导致无法获取ApplicationContext,错误如下:org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext.xml]; nested exception is org.springframework.beans.FatalBeanException: Class [org.springframework.transaction.config.TxNamespaceHandler] for namespace [http://www.springframework.org/schema/tx] does not implement the [org.springframework.beans.factory.xml.NamespaceHandler] interface

这个spring配置文件肯定没有格式错误的,老项目都用了好多年了,用下面这种方法可以获取到spring的ApplicationContext,就是在web.xml配置一个    

<listener>

        <listener-class>com.shenhua.common.spring.SpringPlugin</listener-class>

</listener>

然后继承ServletContextListener

public class SpringPlugin implements IPlugin,ServletContextListener {

    private String[] configurations;
    private ApplicationContext ctx;
    public SpringPlugin() {
    }

    public SpringPlugin(String... configurations) {
        this.configurations = configurations;
    }

    public SpringPlugin(ApplicationContext ctx) {
        this.ctx = ctx;
    }

    public boolean start() {
        System.out.println(IocInterceptor.ctx+"-----");
//        if (ctx != null)
//            IocInterceptor.ctx = ctx;
//        else if (configurations != null)
//            IocInterceptor.ctx = new FileSystemXmlApplicationContext(configurations);
//        else
//            IocInterceptor.ctx = new FileSystemXmlApplicationContext(PathKit.getWebRootPath() + "/WEB-INF/classes/applicationContext.xml");
        return true;
    }

    public boolean stop() {
        return true;
    }

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {

        IocInterceptor.ctx = WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext());
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}
其中contextInitialized方法能获取到ApplicationContext,但是start方法打印出来的仍然是null,start注释的方法报的是先前的那个错误,大神帮忙看下怎么解决吧,怎么能把contextInitialized方法里的内容给一个静态全局变量赋值,然后不会被jfinal清空,谢谢

加载中
0
JFinal
JFinal

     既然老方法中使用实现ServletContextListener 接口的方式可以启动,那么就用这种方式,然后改造一下 IocInterceptor,在其中使用一下此种启动方式下可获取的bean即可


JFinal
JFinal
回复 @hongflyfly : 用 static 将这个值存起来就好
hongflyfly
hongflyfly
回复 @JFinal : 您这个方法我试过,但是这个变量会在jfinal启动完变成null,不知道为啥
JFinal
JFinal
回复 @hongflyfly : 能否做到先确保用老方式加载spring,可以正常工作?在此基础上,改造IocInterceptor,最简单的办法是在老方式启动spring的那个类中用一个static 变量保持住spring的context,然后在IocInterceptor 中引用即可
hongflyfly
hongflyfly
WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext());获取到的context在jfinal启动完就变成了null,这个IocInterceptor要怎么改造啊​
0
车开源
车开源
求分享整合Spring的好处
hongflyfly
hongflyfly
老项目都是spring写的,不想动太多代码,就想整合了
0
insights
insights
我想问下,整合的目的是啥,要集成jfinal的什么优点? 顺便说说jfinal的优点?
hongflyfly
hongflyfly
jfinal的优点官网有啊,整合的目的是为了兼容老项目
0
hongflyfly
hongflyfly
@JFinal  
请教一个问题,我在ServletContextListener的contextInitialized方法中给一个静态变量赋值
public class Quanju {
    public static ApplicationContext cc;
}
 @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
                Quanju.cc =WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext());
                System.out.println(Quanju.cc);//这个有值
    }
但是jfinal初始化后    
public void afterJFinalStart() { 
        System.out.println(Quanju.cc);//这个打印出来null
}
这个值变成了null,是什么原因啊?
0
JFinal
JFinal

引用来自“hongflyfly”的评论

@JFinal  
请教一个问题,我在ServletContextListener的contextInitialized方法中给一个静态变量赋值
public class Quanju {
    public static ApplicationContext cc;
}
 @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
                Quanju.cc =WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext());
                System.out.println(Quanju.cc);//这个有值
    }
但是jfinal初始化后    
public void afterJFinalStart() { 
        System.out.println(Quanju.cc);//这个打印出来null
}
这个值变成了null,是什么原因啊?
可能是 classload 不是同一个,将 class load 手动调整一下
hongflyfly
hongflyfly
@JFinal 不太会啊,求指点,哪个类,核心代码是有哪些,谢谢!
0
JFinal
JFinal

  切换class load 方式代码不优雅,用我下面介绍的方式:

public class MySpringPlugin implements IPlugin {
 public boolean start() {
   IocInterceptor.ctx =   WebApplicationContextUtils.getWebApplicationContext(JFinal.me().getServletContext());
  return true;
 }

 public boolean stop() {
  return true;
}

   关键在于 JFinal.me().getServletContext()这一行代码。

0
hongflyfly
hongflyfly

引用来自“JFinal”的评论

  切换class load 方式代码不优雅,用我下面介绍的方式:

public class MySpringPlugin implements IPlugin {
 public boolean start() {
   IocInterceptor.ctx =   WebApplicationContextUtils.getWebApplicationContext(JFinal.me().getServletContext());
  return true;
 }

 public boolean stop() {
  return true;
}

   关键在于 JFinal.me().getServletContext()这一行代码。

@JFinal 

JFinal.me().getServletContext()这个方法会报错:

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext.xml]; nested exception is org.springframework.beans.FatalBeanException: Class [org.springframework.transaction.config.TxNamespaceHandler] for namespace [http://www.springframework.org/schema/tx] does not implement the [org.springframework.beans.factory.xml.NamespaceHandler] interface


我只能在ServletContextListener的继承类里获取spring的context:
 public void contextInitialized(ServletContextEvent servletContextEvent) {
        IocInterceptor.ctx = WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext());
    }
}
但是context的值无法给别的类赋值,哪怕是static的变量也会被jfinal初始化完后置null
hongflyfly
hongflyfly
回复 @JFinal : 可以保证Listener 启动spring后是可以正常工作的,并且我把context赋值给了一个static变量,但是jfinal读这个变量是null
JFinal
JFinal
总而言之,你先要确保使用Listener 启动spring后是可以正常工作的,然后才进行下一步:与jfinal的整合
JFinal
JFinal
注意一下 applicationContext.xml 中的 bean 标记中的 schame属性,根据异常判断是版本不对,以下这个是比较高的版本http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
hongflyfly
hongflyfly
@JFinal 虽然jfinal获取不到这个static变量的值,但是我在jsp页面<%System.out.println( Quanju.cc);%>能获取到,感觉jfinal把所有的类又初始化了一遍,通过jfinal获取到的只能是null,有办法解决吗
0
ylx252
ylx252

看看 这个

https://git.oschina.net/Bitter/spring-jfinal

hongflyfly
hongflyfly
这个代码我之前搜到过,试过不行,都报xml解析错误,WebApplicationContextUtils.getWebApplicationContext(JFinal.me().getServletContext())不好使 现在主要问题在于jfinal代码和非jfinal代码无法通信,同一个static变量取到的值不一样
0
ylx252
ylx252
你还是先检查下为什么 spring 解析 xml,这个和 jfinal 无关
hongflyfly
hongflyfly
在listener里spring解析正常,但是jfinal里解析就报错了,我想把listener里解析出来的context给jfinal,但是不知道怎么做,赋值给一个static变量也会被jfinal给置null
返回顶部
顶部