我在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应用程序不起作用。
答案 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);
}