2012-06-08 20 views
2

當我通過Glassfish將JAX-WS作爲標準Web應用程序服務進行部署時,一切正常。無法將JAX-WS作爲Glassfish中的OSGi包部署

相同的JAR文件也是OSGi包(所以是WAB)。如果我嘗試將其作爲OSGi包進行安裝,則會出現有關返回屬性未出現在響應中的錯誤。這是Web服務類:

package org.example; 

import javax.jws.WebService; 
import javax.jws.WebMethod; 
import javax.xml.ws.ResponseWrapper; 

@WebService 
public class ExampleComponent { 
    private String message = new String("Hello, "); 

    public ExampleComponent() { 
    } 

    public String sayHello(String name) { 
     return message + name + "."; 


    } 
} 

這是錯誤我得到:

javax.xml.ws.WebServiceException: class org.example.Wrapper do not have a property of the name return 
at com.sun.xml.ws.server.sei.EndpointResponseMessageBuilder$DocLit.<init>(EndpointResponseMessageBuilder.java:217) 
at com.sun.xml.ws.server.sei.TieHandler.createResponseMessageBuilder(TieHandler.java:210) 
at com.sun.xml.ws.server.sei.TieHandler.<init>(TieHandler.java:116) 
at com.sun.xml.ws.db.DatabindingImpl.<init>(DatabindingImpl.java:108) 
at com.sun.xml.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:74) 
at com.sun.xml.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:58) 
at com.sun.xml.ws.db.DatabindingFactoryImpl.createRuntime(DatabindingFactoryImpl.java:130) 
at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:433) 
at com.sun.xml.ws.server.EndpointFactory.create(EndpointFactory.java:268) 
at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:145) 
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:569) 
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:552) 
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:623) 
at org.glassfish.webservices.WSServletContextListener.registerEndpoint(WSServletContextListener.java:282) 
at org.glassfish.webservices.WSServletContextListener.contextInitialized(WSServletContextListener.java:102) 
at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:4750) 
at com.sun.enterprise.web.WebModule.contextListenerStart(WebModule.java:550) 
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5366) 
at com.sun.enterprise.web.WebModule.start(WebModule.java:498) 
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:917) 
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:901) 
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:733) 
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2018) 
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1669) 
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:109) 
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130) 
at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269) 
at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:301) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) 
at org.glassfish.osgijavaeebase.OSGiDeploymentRequest.deploy(OSGiDeploymentRequest.java:183) 
at org.glassfish.osgijavaeebase.OSGiDeploymentRequest.execute(OSGiDeploymentRequest.java:118) 
at org.glassfish.osgijavaeebase.AbstractOSGiDeployer.deploy(AbstractOSGiDeployer.java:121) 
at org.glassfish.osgijavaeebase.OSGiContainer.deploy(OSGiContainer.java:154) 
at org.glassfish.osgijavaeebase.JavaEEExtender.deploy(JavaEEExtender.java:107) 
at org.glassfish.osgijavaeebase.JavaEEExtender.access$200(JavaEEExtender.java:61) 
at org.glassfish.osgijavaeebase.JavaEEExtender$HybridBundleTrackerCustomizer$1.call(JavaEEExtender.java:151) 
at org.glassfish.osgijavaeebase.JavaEEExtender$HybridBundleTrackerCustomizer$1.call(JavaEEExtender.java:148) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:680) 
Caused by: javax.xml.bind.JAXBException: return is not a valid property on class org.example.Wrapper 
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getElementPropertyAccessor(JAXBContextImpl.java:981) 
at com.sun.xml.ws.db.glassfish.JAXBRIContextWrapper.getElementPropertyAccessor(JAXBRIContextWrapper.java:121) 
at com.sun.xml.ws.server.sei.EndpointResponseMessageBuilder$DocLit.<init>(EndpointResponseMessageBuilder.java:214) 
... 42 more 

如果我添加以下注釋的方法,並創建一個包裝類,它還挺作品:

@WebMethod 
@ResponseWrapper(className="org.example.Wrapper") 

使用這些註釋,沒有安裝錯誤,我能夠檢索WSDL。然而,測試儀不能正常工作,我從我的瀏覽器中得到這樣的信息:

Exceptions details : java.lang.RuntimeException: Cannot find the correct port class. 
javax.servlet.ServletException: java.lang.RuntimeException: Cannot find the correct port class. at 
org.glassfish.webservices.monitoring.WebServiceTesterServlet.initializePort(WebServiceTesterServlet.java:572) at 
org.glassfish.webservices.monitoring.WebServiceTesterServlet.doGet(WebServiceTesterServlet.java:169) at 
org.glassfish.webservices.monitoring.WebServiceTesterServlet.invoke(WebServiceTesterServlet.java:104) at 
org.glassfish.webservices.JAXWSServlet.doGet(JAXWSServlet.java:186) at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) at 
javax.servlet.http.HttpServlet.service(HttpServlet.java:770) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542) at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at 
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at 
com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at 
com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) 
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) at 
com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) at 
com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at 
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at 
com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at 
com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at 
com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at 
com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:680) Caused by: java.lang.RuntimeException: 
Cannot find the correct port class. at org.glassfish.webservices.monitoring.WebServiceTesterServlet.initializePort(WebServiceTesterServlet.java:559) ... 29 more 

我寧可不要添加這些註釋爲每個方法和包裝類,只是把事情的工作,甚至這樣做,仍然不是最佳的。

UPDATE:這裏的WSDL文件如下:

<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.2-b13 (branches/2.2-6964; 2012-01-09T18:04:18+0000) JAXWS-RI/2.2.6-promoted-b20 JAXWS/2.2 svn-revision#unknown. --> 
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.2-b13 (branches/2.2-6964; 2012-01-09T18:04:18+0000) JAXWS-RI/2.2.6-promoted-b20 JAXWS/2.2 svn-revision#unknown. --> 
<definitions targetNamespace="http://example.org/" name="ExampleComponentService"> 
    <types> 
    <xsd:schema> 
     <xsd:import namespace="http://example.org/" schemaLocation="http://localhost:8080/test-jaxws/ExampleComponentService?xsd=1"/> 
    </xsd:schema> 
    </types> 
    <message name="sayHello"> 
    <part name="parameters" element="tns:sayHello"/> 
    </message> 
    <message name="sayHelloResponse"> 
    <part name="parameters" element="tns:sayHelloResponse"/> 
    </message> 
    <portType name="ExampleComponent"> 
    <operation name="sayHello"> 
     <input wsam:Action="http://example.org/ExampleComponent/sayHelloRequest" message="tns:sayHello"/> 
     <output wsam:Action="http://example.org/ExampleComponent/sayHelloResponse" message="tns:sayHelloResponse"/> 
    </operation> 
    </portType> 
    <binding name="ExampleComponentPortBinding" type="tns:ExampleComponent"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
    <operation name="sayHello"><soap:operation soapAction=""/> 
     <input> 
     <soap:body use="literal"/> 
     </input> 
     <output> 
     <soap:body use="literal"/> 
     </output> 
    </operation> 
    </binding> 
    <service name="ExampleComponentService"> 
    <port name="ExampleComponentPort" binding="tns:ExampleComponentPortBinding"> 
     <soap:address location="http://localhost:8080/test-jaxws/ExampleComponentService"/> 
    </port> 
    </service> 
</definitions> 
+0

你能告訴我你的wsdl文件嗎? –

+0

@PauliusMatulionis,我添加了WSDL文件。 –

+0

我不知道你在做什麼,但是我們有一個使用JAX-WS的測試包,它工作正常。你可以在這裏找到它:https://svn.java.net/svn/glassfish~svn/trunk/fighterfish/test/testapp/test.app17 – sahoo

回答

0

我知道這是沒有辦法解決你的問題,但也許你可以有一個看的http://cxf.apache.org/。 CXF是專門用於SOAP/REST Web服務的服務框架,並且與OSGi很好地協作。也許這可以解決你的問題。

+0

我看着CXF,特別是OSGi遠程服務實現,但它似乎就像它有很多的依賴關係和更大的佔用面積,如果我沒有記錯的話,即使我使用的是Glassfish和JSF,也需要一堆Spring bundle。 –

+0

有很多依賴關係,這是真的。但是,Apache將所有這些依賴關係捆綁在一個捆綁包jar中:http://cxf.apache.org/dosgi-releases.html。您只需要單捆綁包發行版即可。 –

1

我不確定這是否是您確切的問題,但在嘗試部署簡單測試WebService時出現類似異常。它有這些異常在堆棧的底部:

javax.xml.ws.WebServiceException: class com.test.AddResponse do not have a property of the name return 
javax.xml.bind.JAXBException: return is not a valid property on class com.test.AddResponse 

看着Sahoo的示例代碼後,我在osgi.properties他們的Web服務測試包看到這個:

# See http://java.net/jira/browse/GLASSFISH-16551 as to why the WAB needs to import JAXB classes 
DynamicImport-Package=javax.xml.bind, javax.xml.bind.* 

的鏈接解釋了爲什麼問題並且爲了解決這個問題,你可能會將這些軟件包包含爲動態導入。