我正在学习用@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中找到):
我收到此错误:
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
参考
我想我将学会使用这个生成的url路径('webservices'),直到我更了解如何配置它。
更新(2014年1月20日):
我用Enpoint.publish
完成了一种方法,并将其作为答案添加。
答案 0 :(得分:1)
大多数情况下,在生成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;来自tomee中部署的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 +任何提示运行吗?