如何在Glassfish上的Metro上选择CXF

时间:2010-01-14 12:42:52

标签: glassfish classpath jax-ws cxf java-metro-framework

我在Glassfish下运行我的企业应用程序时遇到the following problem(由其他人报告)。在Jetty下工作正常。

javax/xml/ws/spi/Provider提到创建META-INF / services / javax.xml.ws.spi.Provider资源,但这已经提供给CXF并且创建一个额外的资源文件并不能解决Glassfish下的这个问题。 / p>

有谁知道如何确保在GlassFish下使用CXF? (我正在使用具有CXF依赖性2.2.5的Maven多模块项目)

谢谢!


编辑#1

暂时解决问题,只使用Metro,但我真的很想知道如果有人有任何指针,如何使用CXF ..如果没有任何作用我可能需要切换Web应用程序容器(或看看Metro满足我的要求)


编辑#2

通过将<class-loader delegate="false"/>添加到sun-web.xml文件,某些解决方案详细说明了针对war的修复。但是,这对非战争ee应用程序不起作用。

3 个答案:

答案 0 :(得分:5)

添加一个sun-web.xml并将delegate = false设置为class-loader:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD 
Application Server 9.0 Servlet 2.5//EN' 
'http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd'> 
<sun-web-app> 
    <class-loader delegate="false"/> 
</sun-web-app> 

答案 1 :(得分:1)

Metro(Glassfish的JAX-WS实现)jar可能包含在Glassfish中,你可以将它们从类路径中排除吗?由于您正在使用maven,因此您应该分析glassfish依赖项并对地铁罐使用排除。


您似乎需要在Metro jar之前的应用程序类路径上安装CXF jar。您可能无法修改系统类加载器/类路径,但您可以更改Thread.currentThread().getContextClassLoader(),使其首先加载CXF。您可以修改Glassfish中的类路径设置

查看javax.xml.ws.spi.FactoryFinder#find()的来源,了解提供商的实际加载方式

答案 2 :(得分:0)

我提出的解决方案(并不满意)是使用JaxWsProxyFactoryBean。这里有一个例子。1

这是你要做的事情的主旨:

public static void main(String args[]) throws Exception {

    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

    // I didn't need these next 2 calls, but I doubt they hurt
    factory.getInInterceptors().add(new LoggingInInterceptor());
    factory.getOutInterceptors().add(new LoggingOutInterceptor());

    factory.setServiceClass(AuthService.class);
    factory.setAddress("http://localhost:7001/authManager/services/cxfAuth");

    // 'AuthService' is whatever your interface type is
    AuthService client = (AuthService) factory.create();

    Employee employee = client.getEmployee("0223938");
    System.out.println("Server said: " + employee.getLastName() + ", " + employee.getFirstName());
    System.exit(0);

}