8

在 Glassfish 下运行我的企业应用程序时,我遇到了以下问题(由其他人报告)。在 Jetty 下它工作正常。

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

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

谢谢!
蒂姆


编辑#1

暂时跳过这个问题,只使用 Metro,但如果有人有任何指示,我真的很想知道如何使用 CXF。如果没有任何效果,我可能不得不切换 Web 应用程序容器(或查看 Metro 来填充我的要求)


编辑#2

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

4

3 回答 3

6

添加一个 sun-web.xml 并将 delegate=false 设置为类加载器:

<?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> 
于 2010-12-09T15:33:02.597 回答
1

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


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

查看javax.xml.ws.spi.FactoryFinder#find() 的源代码以查看提供程序的实际加载方式

于 2010-01-14T14:12:08.287 回答
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);

}
于 2011-08-15T22:21:09.530 回答