`
lzh309
  • 浏览: 6323 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

Jboss不支持struts spring注解问题

阅读更多

使用struts2注解(struts2-convention-plugin-2.1.8.1)无配置开发的web项目,在tomcat里面运行没有问题,移植到jboss后出现:no result defined for action异常,无法访问action,上google查询资料,找到相应解决方案。 Jboss使用了vfs,于是于是URL的protocol都变成了vfsfile, vfszip等等。 查看xword的源码,在类com.opensymphony.xwork2.util.finder.ClassFinder的 122行左右,里面是写死的,"jar".equals(location.getProtocol(), "file".equals(location.getProtocol()。 解决方法:由于不能影响到非jboss server,如tomcat,所以不好改写ClassFinder。采用改写struts2 convention插件的方案,替换org.apache.struts2.convention.ActionConfigBuilder 如下:

<bean type="org.apache.struts2.convention.ActionConfigBuilder" name="convention" class="com.sunyard.ices.web.actions.jxc.MyActionConfigBuilder"/>


MyActionConfigBuilder类的内容如下:

package com.sunyard.ices.web.actions.jxc;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.convention.PackageBasedActionConfigBuilder;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.finder.ClassFinder;
import com.opensymphony.xwork2.util.finder.Test;


public class MyActionConfigBuilder extends PackageBasedActionConfigBuilder {

	private static Log log = LogFactory.getLog(MyActionConfigBuilder.class);
	private static final String BASE_FILE = "struts.xml";

	private String[] actionPackages;
	private String[] packageLocators;

	public static String classPath = "";

	/** 
	 *  
	 * @param configuration 
	 * @param container 
	 * @param objectFactory 
	 * @param redirectToSlash 
	 * @param defaultParentPackage 
	 */

	@Inject
	public MyActionConfigBuilder(Configuration configuration, Container container, ObjectFactory objectFactory,
			@Inject("struts.convention.redirect.to.slash") String redirectToSlash,
			@Inject("struts.convention.default.parent.package") String defaultParentPackage) {

		super(configuration, container, objectFactory, redirectToSlash, defaultParentPackage);

	}

	/** 
	 *  
	 * @param actionPackages 
	 *            (Optional) An optional list of action packages that this 
	 *            should create 
	 *  
	 * configuration for. 
	 *  
	 */
	@Inject(value = "struts.convention.action.packages", required = false)
	public void setActionPackages(String actionPackages) {
		super.setActionPackages(actionPackages);

		if (!"".equals(actionPackages.trim())) {
			this.actionPackages = actionPackages.split("\\s*[,]\\s*");
		}
	}

	/** 
	 *  
	 * @param packageLocators 
	 *            (Optional) A list of names used to find action packages. 
	 *  
	 */

	@Inject(value = "struts.convention.package.locators", required = false)
	public void setPackageLocators(String packageLocators) {
		super.setPackageLocators(packageLocators);
		this.packageLocators = packageLocators.split("\\s*[,]\\s*");
	}

	@Override
	@SuppressWarnings("unchecked")
	protected Set<Class> findActions() {

		Set<Class> classes = new HashSet<Class>();

		try {
			// ClassFinder finder = new ClassFinder(getClassLoaderForFinder(), buildUrls(), true);
			ClassFinder finder = new ClassFinder(getClassLoaderInterface(), buildUrls(), true);

			if (actionPackages != null) {

				for (String packageName : actionPackages) {
					Test<ClassFinder.ClassInfo> test = getPackageFinderTest(packageName);
					classes.addAll(finder.findClasses(test));
				}
			}

			// package locators
			if (packageLocators != null) {

				for (String packageLocator : packageLocators) {
					Test<ClassFinder.ClassInfo> test = getPackageLocatorTest(packageLocator);
					classes.addAll(finder.findClasses(test));
				}
			}

		} catch (Exception ex) {
			if (log.isErrorEnabled()) {
				log.error("Unable to scan named packages", ex);
			}
		}

		return classes;
	}

	private List<URL> buildUrls() throws MalformedURLException {

		List<URL> urls = new ArrayList<URL>();
		URL classesUrl = getClassLoader().getResource(BASE_FILE);

		if (classesUrl == null) {
			throw new IllegalStateException("File " + BASE_FILE
					+ " was not found. The folder WEB-INF/classes discovery base on file classes/" + BASE_FILE + ".");
		}

		String baseFilePath = classesUrl.getFile();
		URL url = new URL("file", "", baseFilePath.substring(0, baseFilePath.indexOf(BASE_FILE)));
		System.out.println(url);
		if (log.isInfoEnabled()) {
			classPath = url.getFile();
			log.info("Struts2 ActionConfigBuilder, classes directory: " + classPath);
		}
		System.out.println("classPath = " + classPath);
		System.out.println(url.toExternalForm());
		urls.add(url);

		return urls;

	}

	/*private ClassLoader getClassLoader() { 
	
	    return Thread.currentThread().getContextClassLoader(); 
	
	}*/

}



上述解决了struts2注解开发方式无法访问action的问题

 

但是jboss对spring的支持也有问题,解决方案

 

需引入jboss-spring-int-vfs.jar

在web.xml 加入配置:

<context-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.jboss.spring.vfs.context.VFSXmlWebApplicationContext
        </param-value>
</context-param>

 

这样就不会有问题,如果要在tomcat运行需要去掉web的配置

 

 

分享到:
评论

相关推荐

    ejb3.rar_EJB3 struts2_MyEclipse EJ_ejb strut jboss_jboss_struts2

    JBoss是基于Java的开源应用服务器,支持EJB3和Spring等框架,用于部署和运行Web应用程序。在这个项目中,它作为运行环境,承载着EJB组件和Struts2应用。 在压缩包的文件名称列表中,"www.pudn.com.txt"可能是一个...

    EJB3与Struts与Spring整合开发(SSE)

    EJB3、Struts和Spring是Java企业级开发中的三个重要框架,它们分别在不同的层次上解决了应用程序的设计和管理问题。EJB3是Java企业版(Java EE)的一部分,提供了面向服务的组件模型,用于构建可扩展且可靠的分布式...

    spring+struts+ejb整合

    在IT行业中,Spring、Struts和EJB是三个非常重要的框架,它们分别专注于不同领域的应用开发。Spring是一个全面的后端开发框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及大量的企业级服务。...

    spring struts

    8. **部署与运行**:项目部署通常涉及到Web服务器(如Tomcat)和应用服务器(如JBoss)的配置,包括web.xml文件的设置,以确保Spring和Struts的正确加载和初始化。 9. **测试**:在集成环境中,单元测试和集成测试...

    struts2.1.8 + spring2.5.6 + hibernate3.3.2整合

    ### Struts2.1.8 + Spring2.5.6 + Hibernate3.3.2整合实践 #### 一、概述 在Java Web开发领域,Struts2、...通过以上步骤,可以实现Struts2、Spring和Hibernate的整合,为开发复杂的Java Web应用提供强大的技术支持。

    精通Java EE项目案例-基于Eclipse Spring Struts Hibernate光盘源码(第二版)

    在Java EE项目中,Eclipse能够方便地创建、配置和运行Web项目,支持多种服务器插件如Tomcat、Jboss等,为开发带来便利。 Spring框架是Java EE应用中的核心组件,它提供了一种轻量级的容器,用于管理对象的生命周期...

    J2EE考试复习试题_struts2_spring_hibernate.doc

    ### J2EE考试复习知识点详解 #### Struts2框架概览 - **起源与组成**:Struts2框架源于WebWork框架与XWork...以上知识点涵盖了Struts2、Spring、Hibernate及EJB的主要概念和技术细节,有助于深入理解和掌握这些技术。

    jboss-4.2.2.GA

    2. **集成第三方框架**:可轻松集成Spring、Struts等流行框架,扩展应用功能。 总之,JBoss 4.2.2.GA作为一个成熟的Java EE应用服务器,为企业级应用开发提供了强大的支持。通过深入理解其核心特性、部署配置、安全...

    SSH 配置实例: Spring 3.1 + Hibernate 4.2 + Struts 2.3

    标题中的“SSH 配置实例: Spring 3.1 + Hibernate 4.2 + Struts 2.3”指的是一个集成开发环境的配置教程,它将三个流行的技术框架——Spring、Hibernate和Struts2——结合在一起,用于构建企业级Java应用。...

    Spring发展历程

    为了解决这些问题,**Struts2**进一步发展并改进了Struts1的设计理念。Struts2采用了拦截器(Interceptor)模型,允许Action类直接继承自JavaBean,从而提供了更好的灵活性和可扩展性。Struts2的核心特性包括: - *...

    Spring2.5-中文参考手册

    9. **与其他框架的整合**:Spring 2.5增强了与Struts、JSF等其他Web框架的集成,以及与Quartz、JBoss等任务调度、EJB等企业服务的整合。 10. **性能优化**:Spring 2.5在性能方面也有提升,包括更快的启动时间,更...

    (sshproject)tomcat调用jboss上的ejb3.0

    我们将讨论SSH(Spring、Struts2、Hibernate)项目的配置以及客户端和服务器端之间的交互。 首先,SSH是一个广泛使用的Java Web开发框架组合,它由Spring框架负责控制层,Struts2处理视图层,而Hibernate则用于持久...

    【个人经验】SSH集成步骤 SSI集成步骤

    SSH分别代表Struts、Spring和Hibernate,而SSI则通常指Spring和iBatis。这篇文章将详细解析这两个集成过程以及相关缓存技术。 首先,SSH集成涉及Struts、Spring和Hibernate的整合。Struts作为MVC框架负责前端展示...

    SSH 整合时的jar包

    SSH(Struts、Spring、Hibernate)是Java Web开发中常用的一种框架组合,用于构建高效、可维护性高的企业级应用程序。这些框架各自负责不同的职责:Struts处理MVC(Model-View-Controller)架构,Spring提供依赖注入...

    ssh整合jar包

    整合SSH的过程中,需要注意版本兼容性问题,不同版本的SSH框架可能存在不兼容的情况,因此选择匹配的版本组合非常重要。此外,良好的模块化设计和代码组织结构也是保证整合成功的关键因素。 通过SSH整合,开发者...

    星课堂SSH框架开发服务端代码,包含文件上传

    6. **集成与配置**:SSH框架的集成涉及到各个组件的配置,如Struts的配置文件、Spring的ApplicationContext配置文件、Hibernate的实体映射文件(hbm.xml或注解)。这些配置文件定义了各层间的协作方式,以及如何将...

    ssh框架常用的jar包

    SSH框架,全称为Spring、Struts和Hibernate的组合,是Java Web开发中广泛使用的三大开源框架。它们分别负责不同层面的应用:Spring提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,用于简化应用程序的开发和...

    学习三大框架基础知识的总结

    Struts、Hibernate、Spring 这三个框架是Java开发中非常重要的组成部分,它们分别负责Web应用程序的展示层、持久层和业务层。以下是对这三个框架基础知识的深入解释。 **Struts框架**是MVC(Model-View-Controller...

    SSH整合jar包

    SSH框架是Java开发中常用的三大框架——Spring、Struts和Hibernate的组合,它们协同工作以构建高效、可维护的企业级应用程序。本压缩包提供了一个经过调试的SSH整合包,可以直接用于项目开发,大大节省了配置和调试...

Global site tag (gtag.js) - Google Analytics