如何在TomEE上更改@WebService生成的“Web服务”路径

时间:2013-12-11 00:17:51

标签: java web-services tomee

我正在学习用@WebService注释我的课程的绳索我注意到当我部署到TomEE-plus(v1.6)时,我在网址中得到了一个额外的'webservices'字样。

我想要删除它,或者如果可能的话重命名它。

给定一个名为WebAPI-DEV的Eclipse项目的代码:

import java.util.List;
import javax.ejb.Stateless;
import javax.jws.WebService;

@Stateless
@WebService
public class WEBAPIImplementation {
    public List<Client> getClientsByTerm(String term) {
        return null;
    }
}

我在catalina日志中找到以下内容:

Dec 10, 2013 3:49:05 PM org.apache.openejb.server.webservices.WsService deployApp
INFO: Webservice(wsdl=http://mylocalhost.com:8080/WebAPI-DEV/webservices/WEBAPIImplementation, qname={http://mylocalhost.com:8080/webapi}WEBAPIImplementationService) --> Ejb(id=WEBAPIImplementation)

网址http://mylocalhost.com:8080/WebAPI-DEV/webservices/WEBAPIImplementation包含'webservices'。

我宁愿更多地控制我的webservice网址的确切名称。

这可能吗?

更新(2013-DEC-16): 我按照

中的简单教程进行操作
  

http://blog.sortedset.com/step-by-step-web-services-with-tomcat-tomee-apache-cxf-eclipse/

基本上@Webservice注释中的参数会导致如下错误:

org.apache.openejb.config.ValidationFailedException: Module failed validation. AppModule(name=TEST-WS)

和...

org.apache.catalina.LifecycleException: An invalid Lifecycle transition was attempted ([before_destroy]) for component [StandardEngine[Catalina].StandardHost[mylocalhost.com].StandardContext[/TEST-WS]] in state [STARTING_PREP]

和...

SEVERE: Error deploying web application archive C:\apache-tomee-plus-1.6.0\webapps\TEST-WS.war
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[mylocalhost.com].StandardContext[/TEST-WS]]

最初我有@Webservice (replace sortedset.com for localhost):

的这些参数
@WebService(
        portName = "HelloTomEEPort",
        serviceName = "HelloTomEEService",
        targetNamespace = "http://localhost/wsdl",
        endpointInterface = "HelloTomEEWs")

以下是我的两个源文件(我从头开始创建一个新项目):

TESTWS.java

import javax.jws.WebService;
@WebService
public interface TESTWS {    
    public int sum(int add1, int add2); 
    public int multiply(int mul1, int mul2);
}

TESTWSImpl.java

import javax.ejb.Stateless;
import javax.jws.WebService;
@Stateless
@WebService
public class TESTWSImpl implements TESTWS { 
    public int sum(int add1, int add2) {
        return add1 + add2;
    } 
    public int multiply(int mul1, int mul2) {
        return mul1 * mul2;
    }
}

此代码允许TomEE启动,但是当我请求url时(在catalina.log中找到):

  

http://mylocalhost.com:8080/TEST-WS/webservices/TESTWSImpl

我收到此错误:

Dec 16, 2013 5:21:57 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
WARNING: Interceptor for {http://mylocalhost.com/wsdl}TESTWSImplService has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: No such operation: TEST-WS (HTTP GET PATH_INFO: /TEST-WS/webservices/TESTWSImplnull)
    at org.apache.cxf.interceptor.URIMappingInterceptor.handleMessage(URIMappingInterceptor.java:93)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:237)
    at org.apache.openejb.server.cxf.CxfWsContainer.onMessage(CxfWsContainer.java:85)
    at org.apache.openejb.server.webservices.WsServlet.service(WsServlet.java:98)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

导致“没有这样的操作”的原因是什么?

我在哪里可以找到有关@Webservice参数的好文档?

注意:将mylocalhost.com替换为localhost

更新(2013-DEC-17): 我错误地调用了web服务,正确的URL应该是:

  

http://mylocalhost.com:8080/TEST-WS/webservices/TESTWSImpl?wsdl

参考

  

Simple webservice example tomEE not working

我想我将学会使用这个生成的url路径('webservices'),直到我更了解如何配置它。

更新(2014年1月20日): 我用Enpoint.publish完成了一种方法,并将其作为答案添加。

4 个答案:

答案 0 :(得分:1)

不,你不能。这是您的计算机上的WSDL的地址。您可以找到该文件夹​​并相应地重命名。这是你能做的最大努力。 您也可以将localhost替换为您的IP地址。

大多数情况下,在生成WSDL时,您可以配置“WebAPI-DEV/webservices/WEBAPIImplementati”这部分WSDL。 例如,如果您尝试在SOAP UI中创建模拟Web服务,则可以配置WSDL URL的除localhost / IP地址之外的所有部分。

据我所知。  “掌握自己!掌握敌人!”

答案 1 :(得分:1)

url / WebAPI-DEV / webservices / WEBAPIImplementation包含'webservices'。

以上网址不是您的网络服务网址。它是服务器上的位置,这个wsdl位于。

在网络浏览器中打开此网址,您的wsdl将被打开。 现在在wsdl中搜索标签,在这个标签内会有标签。这将是您的webservice端点url。在那里你找不到这个附加的“webservices”字样。

当sombody将呼叫您的网络服务时,将调用此“地址位置”。

是的,您可以绝对控制定义yoyr webservice网址。

通常在生成webservice时,遵循以下格式,

“HTTP://://”

类似于上面的形式。它实际上取决于,你在哪里生成webservice,我的意思是在哪个工具上。

例如:在SAP PI(集成工具)中,webservice url格式是这样的,

的https://:/?XISOAPAdapter / MessageServlet senderParty =安培; senderService =安培; receiverParty =安培; receiverService =安培;接口=安培; interfaceNamespace =

根据要求,您可以控制上述地址。

此致 ambuj “掌握自己,掌握敌人”

答案 2 :(得分:1)

这个帖子很老了,但我还想分享一些链接。 它可以删除&#39; webservices&#39;来自中部署的Web服务路径。我们需要指定一个属性
tomee.jaxws.subcontext = /

tomee.jaxws.subcontext =

conf/system.properties
以下是信息链接
Support Forum for TomEE+ - CXF Configuration
Apache Tomee site Change JAXWS URL

答案 3 :(得分:0)

根据user3090039的回复,我实施了部分解决方案,解决了实施Web服务的紧迫性。我已经实现了一个Java程序,我从main()方法部署了一个Ednpoint。我有两个类WSServer和OrderSearch。 WSServer是创建Endpoint并将部署/发布详细信息传递给OrderSearch类的主类。

这个WSServer类包含main()方法,并启动和配置端点:

import javax.xml.ws.Endpoint;

public class WSServer {
   public static void main(String[] args) {
      // Read application parameters into appSettings...
      AppParams appSettings = readAppParams(propFileName);

      //Create Endpoint, delegate configuration...
      Endpoint.publish(appSettings.getWSEndPoint(), new OrderSearch(appSettings));
      System.out.println("OrderSearch service is ready");
   }
}

AppParams类看起来像这样(简化):

public class AppParams {
   private String ws_end_point;
   // Other private parameters here...
   // Include appropiate getters and setters...
}

方法getWSEndPoint()返回一个类似于:http://mylocalhost/prodOrders的字符串,它发布如下的WSDL:http://mylocalhost/prodOrders?wsdl

最后,OrderSearch类包含将在WSDL中发布的公共web方法:

import javax.jws.WebService;
@WebService
public class OrderSearch {
    public OrderSearch(AppParams settings) {
        // Use the settings object to initialize your business objects...
    }

    public List<ProductOrder> getOrdersByMonth(String orderMonth) {
       List<ProductOrder> orderList = null;

       orderList = dataAdapter.getOrdersByMonth(String orderMonth);

       return orderList;
    }
}

ProductOrder只是一个simle POJO,其中包含您的Web服务使用者所需的属性(即订单日期,订单号,产品ID等)。此POJO用于​​构建将要使用的XML结构发送回消费者/用户。

请注意,Endpoint需要一个字符串和一个实现者(OrderSearch),它将负责处理每个请求。

关于如何使用端点的更多选项(简要说明)由Oracle描述:http://docs.oracle.com/javase/7/docs/api/javax/xml/ws/Endpoint.html

关于如何自定义端点URL还有很多问题,但这就是我的工作。希望将来可以提供更好的文档。

我的下一个任务是将其移至由TOMEE +任何提示运行吗?