目前在做JBoss下布署String2.5 & Struts2集成的工程,在工程中用Spring2.5 的component scan, Struts2 的convention 和 rest plugins。在JBoss下部署都有问题:

Spring 2.5 component scan所有annotation标注的component都无法找到。原因是JBoss用了VFS,所以在Spring中找不到。
解 决方法:使用jboss的 spring-int-vfs 中提供的 org.jboss.spring.vfs.context.VFSClassPathXmlApplicationContext。这个包可以在 http://sourceforge.net/projects/jboss/files/JBoss-Spring%20Integration/
下载到,在页面中部,可以找到JBoss-Spring Integration。下面是我的一段代码:

ApplicationContext appContext = null;
        switch(serverType) {

case tomcat:

appContext = new ClassPathXmlApplicationContext(configFiles);

break;

case jboss:

appContext = new VFSClassPathXmlApplicationContext(configFiles);

break;

}

Struts2 convention, 原因也是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如下:

File: src/plugins/convention/src/main/resources/struts-plugin.xml

<bean type="org.apache.struts2.convention.ActionConfigBuilder" class="com.playphone.struts.convention.MyActionConfigBuilder"/>

MyActionConfigBuilder类的内容如下,这里只是简单的解析WEB-INF/classes下的类,因为我没用到jar包需要被认为action的情况,所以简化。

package com.playphone.struts.convention;

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.ActionNameBuilder;

import org.apache.struts2.convention.InterceptorMapBuilder;

import org.apache.struts2.convention.PackageBasedActionConfigBuilder;

import org.apache.struts2.convention.ResultMapBuilder;

import org.apache.struts2.convention.StringTools;

import com.opensymphony.xwork2.ObjectFactory;

import com.opensymphony.xwork2.config.Configuration;

import com.opensymphony.xwork2.inject.Inject;

import com.opensymphony.xwork2.util.finder.ClassFinder;

import com.opensymphony.xwork2.util.finder.Test;

import com.playphone.spring.EnvVariable;

import com.playphone.spring.ServerType;

/**

* Solve the problem that could not found action under JBoss.

*

* @author <a href="mailto:sunyi4j@gmail.com">Roy</a> on Jul 6, 2009

*/

public class MyActionConfigBuilder extends PackageBasedActionConfigBuilder {

private static Log log = LogFactory.getLog(MyActionConfigBuilder.class);

private static final String BASE_FILE = "appContext.xml";

private String[] actionPackages;

private String[] packageLocators;

/**

* Constructs actions based on a list of packages.

*

* @param configuration         The XWork configuration that the new package configs and action configs

*                              are added to.

* @param actionNameBuilder     The action name builder used to convert action class names to action

*                              names.

* @param resultMapBuilder      The result map builder used to create ResultConfig mappings for each

*                              action.

* @param interceptorMapBuilder The interceptor map builder used to create InterceptorConfig mappings for each

*                              action.

* @param objectFactory         The ObjectFactory used to create the actions and such.

* @param redirectToSlash       A boolean parameter that controls whether or not this will create an

*                              action for indexes. If this is set to true, index actions are not created because

*                              the unknown handler will redirect from /foo to /foo/. The only action that is created

*                              is to the empty action in the namespace (e.g. the namespace /foo and the action "").

* @param defaultParentPackage  The default parent package for all the configuration.

*/

@Inject

public MyActionConfigBuilder(

Configuration configuration,

ActionNameBuilder actionNameBuilder,

ResultMapBuilder resultMapBuilder,

InterceptorMapBuilder interceptorMapBuilder,

ObjectFactory objectFactory,

@Inject("struts.convention.redirect.to.slash") String redirectToSlash,

@Inject("struts.convention.default.parent.package") String defaultParentPackage) {

super(

configuration,

actionNameBuilder,

resultMapBuilder,

interceptorMapBuilder,

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 (!StringTools.isTrimmedEmpty(actionPackages)) {

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() {

if(EnvVariable.getServerType() == ServerType.tomcat) {

return super.findActions();

} else {

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

try {

ClassFinder finder = new ClassFinder(getClassLoaderForFinder(), buildUrls(), true);

// named packages

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 appContext.xml was not found. The folder WEB-INF/classes discovery base on file classes/appContext.xml.");

}

String baseFilePath = classesUrl.getFile();

URL url = new URL("file", "", baseFilePath.substring(0, baseFilePath.indexOf(BASE_FILE)));

if (log.isInfoEnabled()) {

log.info("Struts2 ActionConfigBuilder, classes directory: " + url.getFile());

}

urls.add(url);

return urls;

}

private ClassLoader getClassLoader() {

return Thread.currentThread().getContextClassLoader();

}

}

为了调试方便,可以打开org.apache.struts2.convention log level为debug,然后你就可以清晰地看到哪些action被认出来了。

JBoss下布署Spring2.5和Struts2系统相关推荐

  1. CentOS5.5环境下布署LVS+keepalived

    CentOS5.5环境下布署LVS+keepalived 2010-10-05 15:21:34 标签:负载均衡 LVS ipvsadm keepalived [推送到技术圈] 版权声明:原创作品,允 ...

  2. ecstore安装 mysql_windows下布署ecstore2.0实战教程

    windows单机部署(开发版本)声明: 此方案只限于本地化开发. ecstore目前不支持windows的生产环境 安装包下载 php下载地址:php-5.3.18-nts-Win32-VC9-x8 ...

  3. redis linux下布署

    下载 wget http://download.redis.io/releases/redis-6.2.8.tar.gz 编译 make 在src目录下面会生成 redis-server 将它与red ...

  4. 50台机器无盘服务器,以50台机器小吧为例看深度无盘快速布署的那些事.doc

    以50台机器小吧为例看深度无盘快速布署的那些事 以50台机器小网吧为例看深度无盘快速布署的那些事 干网管这行好几年了,接手的网吧也有不少,这些年头也一直在研究无盘,自认还是有一些了解.测试和安装了这么 ...

  5. 在同一个机器上布署两个JBOSS,要修改那些端口?

    在同一个机器上布署两个JBOSS,要修改那些端口? 当jboss和oracle在同一机器上时,通常oracle占用8080端口, 这时只需要去修改\deploy\jbossweb-tomcat50.s ...

  6. Linux Tomcat JSP 布署详细教程

    Linux Tomcat JSP动态网页解析 v7.0 ★★★ 1 Tomcat 概述 Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Micr ...

  7. Django 布署6.5

    布署 从uwsgi.nginx.静态文件三个方面处理 服务器介绍 服务器:私有服务器.公有服务器 私有服务器:公司自己购买.自己维护,只布署自己的应用,可供公司内部或外网访问 公有服务器:集成好运营环 ...

  8. com+ 三层布署[未成功验证]

    com+ 三层布署[未成功验证] com+ 三层布署[未成功验证] http://topic.csdn.net/u/20070910/10/f6c7614f-cdae-46a7-a9cd-87fdc6 ...

  9. DNSSEC 原理、配置与布署简介

    本文转载自:http://netsec.ccert.edu.cn/duanhx/archives/1479 作者:段海新,清华大学信息网络工程研究中心 ------------------------ ...

最新文章

  1. Java Execution Process
  2. HEAD元素使用集锦
  3. 几种数据库两列字段的拼接方法
  4. [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]
  5. C++ STL 教程
  6. hive判断是否包含
  7. Kafka、RabbitMQ、RocketMQ比较
  8. php调用第三方接口代码,PHP接口编程——调用第三方接口获取天气
  9. ISO50001认证咨询,ISO50001能源管理体系认证企业初次审核需要准备的材料
  10. python win32api教程_Python win32api.GetSystemMetrics方法代码示例
  11. 给android studio安装新字体,如mac系统的monaco字体
  12. Java深入(面试常见题)
  13. 无法访问eclipse官网?镜像源可以帮你
  14. python学什么书_python自学用什么书
  15. presto获取上月第一天和最后一天、当月第一天
  16. 网易云催生云计算更多可能性
  17. 图解Google搜索技术
  18. python和stata哪个数据分析实例,STATA数据分析案例:Zoutendijk可行方向法
  19. 常见的生化检测指标及其意义
  20. response响应,常用方法,分发器重定向,错误提示

热门文章

  1. 如何将一键还原精灵备份文件复制出来?
  2. 洛谷P1280 caioj 1085 动态规划入门(非常规DP9:尼克的任务)
  3. 47.2. 配置 Tomcat 服务器
  4. C语言程序设计第三次作业——选择结构(1)
  5. grunt live reload 配置记录
  6. eclips 的pydev的debug
  7. 在win7下安装SQL sever2005
  8. 2009-08 台湾印象
  9. oracle 的float(b)转
  10. Python爬虫(八)_正则表达式