【问题标题】:How to change the 'webservices' path generated by @WebService on TomEE如何在 TomEE 上更改 @WebService 生成的“webservices”路径
【发布时间】:2013-12-11 00:17:51
【问题描述】:

我正在学习使用 @WebService 注释我的课程的技巧,我注意到当我部署到 TomEE-plus (v1.6) 时,我在 url 中得到了一个额外的“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 包含“网络服务”。

我宁愿对定义我的 web 服务 url 的确切名称有更多的控制权。

这可能吗?

更新(2013 年 12 月 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 年 12 月 17 日): 我错误地调用了网络服务,正确的 url 应该是:

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

引用于

Simple webservice example tomEE not working

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

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

【问题讨论】:

    标签: java web-services apache-tomee


    【解决方案1】:

    这个帖子很老了,但我还是想分享一些链接。 可以从 中部署的网络服务路径中删除“网络服务”。我们需要指定一个属性为
    tomee.jaxws.subcontext = /

    tomee.jaxws.subcontext =

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我试图查找 wsdl 文件,但一无所获。我搜索了一些表明 WEB-INF/schemas 的参考资料,但该目录甚至没有创建。
      【解决方案3】:

      网址 /WebAPI-DEV/webservices/WEBAPIImplementation 包含“webservices”。

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

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

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

      是的,您可以完全控制定义 yoyr webservice url。

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

      “http://”

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

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

      https://:/XISOAPAdapter/MessageServlet?senderParty=&senderService=&receiverParty=&receiverService=&interface=&interfaceNamespace=

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

      问候, 安布吉 “驾驭自己,驾驭敌人”

      【讨论】:

      • http://://"
      • 不,没有用。我按照blog.sortedset.com/… 中的示例进行操作,实际上我必须从@Webservice 注释中删除所有参数,以便它可以获取默认值,否则 TommEE 会拒绝它。
      • 嗨 Salvador,我已经阅读了一些 JAX-WS 实现教程。现在我可以说,您可以完全配置您的端点 url。查找要发布端点 url 的 url 发布者类。例如 Endpoint.publish("localhost:9899/ws/image", new ImageServerImpl());在这里您可以根据您的要求设置您的网址。
      • 感谢 user3090039,我得到了使用 Endpoint.publish 的东西
      • 伟大的工作萨尔瓦多,感谢您与我们分享您的发现。
      【解决方案4】:

      根据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 中发布的公共网络方法:

      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 类只是一个简单的 POJO,具有您的 Web 服务消费者需要的属性(即订单日期、订单号、产品 ID 等)。此 POJO 用于构建将被发送回的 XML 结构给消费者/用户。

      注意端点需要一个字符串和一个负责处理每个请求的实现者(OrderSearch)。

      还有更多关于如何使用端点的选项,正如 Oracle 所描述的(简要地):http://docs.oracle.com/javase/7/docs/api/javax/xml/ws/Endpoint.html

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

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

      【讨论】:

        猜你喜欢
        • 2019-05-07
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-27
        • 1970-01-01
        • 2019-12-27
        相关资源
        最近更新 更多