2014-11-04 4 views
2

내 문제는 jboss에 의해 http://localhost:8080/A에 게시 된 웹 서비스가 있다는 것입니다. 여기에서 A은 서비스 구현 클래스입니다. 맞춤 URL이 필요합니다 http://localhost:8080/B/C/D.ws.JAX-WS 주소를 다시 매핑

wsdl에서 soap:address은 정확하게 http://localhost:8080/B/C/D.ws으로 설정됩니다.

은 전쟁을 배포하는 동안, 서비스는 "잘못된"주소에 게시됩니다 :

INFO [org.jboss.ws.cxf.metadata] Adding service endpoint metadata: id=org.example.ServiceImpl 
address=http://localhost:8080/ServiceImpl 
... 

내가 가진 가장 주소가 서블릿을 통해 변경 한 후 잘못된 URL에서 WS 등을 게시 보스이었다; 하지만 "오른쪽"URL에 SOAP 호출이 /WEB-INF/cxf-servlet.xml 인 404을 반환으로

<?xml ... > 
<beans ... 
    xmlns:jaxws="http://cxf.apache.org/jaxws" ... > 
    <jaxws:endpoint 
     id="someId" 
     implementor="org.example.ServiceImpl" 
     address="/B/C/D.ws" /> 
</beans> 

다음 url-patternweb.xml에서 :

17:41:53,648 INFO [org.jboss.ws.cxf.metadata] Adding service endpoint metadata: id=org.example.ServiceImpl 
address=http://localhost:8080/ServiceImpl 
... 
17:41:59,307 INFO [org.apache.cxf.service.factory.ReflectionServiceFactoryBean] Creating Service {... targetNamespace ...}ServiceImplService from class org.example.ServicePort 
17:41:59,572 INFO [org.apache.cxf.endpoint.ServerImpl] Setting the server's publish address to be /B/C/D.ws 
:

<servlet> 
    <servlet-name>cxf</servlet-name> 
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>cxf</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

이 로그이었다

감사합니다.

답변

4

나는 비슷한 문제가있어서 위와 같이 해결했습니다. 이 접근법. 나는 서비스가 주소를이 보스 AS 내 작동

을 게시 설정 특성 address를 사용처럼

<servlet> 
    <servlet-name>ServiceImpl</servlet-name> 
    <servlet-class>org.example.ServiceImpl</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ServiceImpl</servlet-name> 
    <url-pattern>/B/C/D.ws</url-pattern> 
</servlet-mapping> 

다음 web.xml에서

이 같은 서비스 구현에 대한 URL 패턴을 덮어 씁니다 6.1 (CXF 2.3.1)


EDIT :

,745,151 다음과 같이

jboss-eap-quickstarts/helloworld-ws/를 기반으로 간단한 웹 프로젝트를,이 제이보스 EAP 6.2에서 제대로 작동하는지 확인 만들려면 :

서비스 클래스 :

@WebService(serviceName = "HelloWorldService", portName = "HelloWorld", name = "HelloWorld", endpointInterface = "org.jboss.as.quickstarts.wshelloworld.HelloWorldService", targetNamespace = "http://www.jboss.org/jbossas/quickstarts/wshelloworld/HelloWorld") 
public class HelloWorldServiceImpl implements HelloWorldService { 

    @Override 
    public String sayHello() { 
     return "Hello World!"; 
    } 

    @Override 
    public String sayHelloToName(final String name) { 

     /* Create a list with just the one value */ 
     final List<String> names = new ArrayList<String>(); 
     names.add(name); 

     return sayHelloToNames(names); 
    } 

    @Override 
    public String sayHelloToNames(final List<String> names) { 
     return "Hello " + createNameListString(names); 
    } 

    /** 
    * Creates a list of names separated by commas or an and symbol if its the last separation. This is then used to say hello to 
    * the list of names. 
    * 
    * i.e. if the input was {John, Mary, Luke} the output would be John, Mary & Luke 
    * 
    * @param names A list of names 
    * @return The list of names separated as described above. 
    */ 
    private String createNameListString(final List<String> names) { 

     /* 
     * If the list is null or empty then assume the call was anonymous. 
     */ 
     if (names == null || names.isEmpty()) { 
      return "Anonymous!"; 
     } 

     final StringBuilder nameBuilder = new StringBuilder(); 
     for (int i = 0; i < names.size(); i++) { 

      /* 
      * Add the separator if its not the first string or the last separator since that should be an and (&) symbol. 
      */ 
      if (i != 0 && i != names.size() - 1) 
       nameBuilder.append(", "); 
      else if (i != 0 && i == names.size() - 1) 
       nameBuilder.append(" & "); 

      nameBuilder.append(names.get(i)); 
     } 

     nameBuilder.append("!"); 

     return nameBuilder.toString(); 
    } 
} 

웹.XML : 배포를 위해 다음과 같은 결과를 얻기

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://www.jboss.com/xml/ns/javaee 
     http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd"> 
    <context-root>B</context-root> 
</jboss-web> 

:

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <servlet> 
     <servlet-name>HelloWorldService</servlet-name> 
     <servlet-class>org.jboss.as.quickstarts.wshelloworld.HelloWorldServiceImpl</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>HelloWorldService</servlet-name> 
     <url-pattern>/C/D.ws</url-pattern> 
    </servlet-mapping> 

</web-app> 

를 사용하여 응용 프로그램의 루트 컨텍스트 jboss-web.xml를 덮어 쓰려면 내가 http://localhost:8080/B/C/D.ws?wsdl

에 액세스

11:24:10,371 INFO [org.jboss.ws.cxf.metadata] (MSC service thread 1-7) JBWS024061: Adding service endpoint metadata: id=HelloWorldService 
address=http://localhost:8080/B/C/D.ws 
implementor=org.jboss.as.quickstarts.wshelloworld.HelloWorldServiceImpl 
serviceName={http://www.jboss.org/jbossas/quickstarts/wshelloworld/HelloWorld}HelloWorldService 
portName={http://www.jboss.org/jbossas/quickstarts/wshelloworld/HelloWorld}HelloWorld 
annotationWsdlLocation=null 
wsdlLocationOverride=null 
mtomEnabled=false 
11:24:10,583 INFO [org.apache.cxf.service.factory.ReflectionServiceFactoryBean] (MSC service thread 1-7) Creating Service {http://www.jboss.org/jbossas/quickstarts/wshelloworld/HelloWorld}HelloWorldService from class org.jboss.as.quickstarts.wshelloworld.HelloWorldService 
11:24:10,944 INFO [org.apache.cxf.endpoint.ServerImpl] (MSC service thread 1-7) Setting the server's publish address to be http://localhost:8080/B/C/D.ws 
11:24:11,009 INFO [org.jboss.ws.cxf.deployment] (MSC service thread 1-7) JBWS024074: WSDL published to: file:/C:/desarrollo/java/jboss/jboss-eap-6.2/standalone/data/wsdl/jboss-helloworld-ws.war/HelloWorldService.wsdl 
11:24:11,014 INFO [org.jboss.as.webservices] (MSC service thread 1-3) JBAS015539: Iniciando service jboss.ws.port-component-link 
11:24:11,026 INFO [org.jboss.as.webservices] (MSC service thread 1-3) JBAS015539: Iniciando service jboss.ws.endpoint."jboss-helloworld-ws.war".HelloWorldService 

<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.jboss.org/jbossas/quickstarts/wshelloworld/HelloWorld" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="HelloWorldService" targetNamespace="http://www.jboss.org/jbossas/quickstarts/wshelloworld/HelloWorld"> 

<!-- ... --> 
    <wsdl:service name="HelloWorldService"> 
    <wsdl:port binding="tns:HelloWorldServiceSoapBinding" name="HelloWorld"> 
     <soap:address location="http://localhost:8080/B/C/D.ws"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

이 예제의 소스를 볼 수 있습니다 주소 : https://github.com/fedesierr/jaxws-endpointurl

또 다른 대안이 리버스 프록시 (아파치)를 사용하고 비누의 URL을 설정하는 것입니다.

이 도움이 되었기를 바랍니다.

+0

그것을 작동하지 않습니다. 내 ''와'jaxws : endpoint address'는 같습니다. 'jaxws : endpoint'는 어디에 두었습니까? '/ WEB-INF/whatever-servlet.xml' 또는'/ WEB-INF/beans.xml' 또는'/ META-INF/cxf/cxf.xml' 파일이 필요합니까? – vault

+0

@vault 현재 사용중인 JBoss 버전은 무엇입니까? –

+0

JBoss EAP 6.2 (댓글 길이는 최소 15 자 이상이어야합니다.) – vault

0

그래서, 어떻게 관리 했는가? 저는 JBoss EAP 6.2를 사용 중이며 끝점을 다시 매핑하는 것 외에 제 두 번째 문제는 내 webapp 서블릿을 계속 볼 수있게하는 것입니다.

  • /(웹 애플리케이션)
  • /alpha/read/Name.ws
  • /alpha/write/Name.ws
  • : 내 세 번째 문제는 내가 관리해야하는 URL의 실제 스키마가 있다는 것이다
  • /beta/read/Name.ws
  • /beta/write/Name.ws

그래서 수 없습니다 :

  • 세트 CXFServlet도 : <url-pattern>/*</url-pattern>
  • 바꾼다 보스-web.xml을 : <context-root>/</context-root>

용액 : CXFServlet S는 URL, jaxws:endpoint address 번째 부분의 첫 번째 부분을 정의한다.

web.xml

<servlet> 
    <servlet-name>alpha</servlet-name> 
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 
    <init-param> 
     <param-name>config-location</param-name> 
     <param-value>/WEB-INF/alpha.xml</param-value>  
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet> 
    <servlet-name>beta</servlet-name> 
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 
    <init-param> 
     <param-name>config-location</param-name> 
     <param-value>/WEB-INF/beta.xml</param-value>  
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet> 
    <servlet-name>mywebapp</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    <multipart-config> 
     <location>/tmp</location> 
     <max-file-size>10485760</max-file-size> 
     <max-request-size>1048576</max-request-size> 
     <file-size-threshold>10485760</file-size-threshold> 
    </multipart-config> 
</servlet> 

<servlet-mapping> 
    <servlet-name>alpha</servlet-name> 
    <!-- WARNING: This string becomes a prefix of jaxws:endpoint address --> 
    <url-pattern>/alpha/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>beta</servlet-name> 
    <!-- WARNING: This string becomes a prefix of jaxws:endpoint address --> 
    <url-pattern>/beta/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>mywebapp</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

alpha.xml

<beans xmlns="http://www.springframework.org/schema/beans" ... > 

    <jaxws:endpoint id="alphaRead" 
      implementor="path.to.AlphaReadImpl" 
      address="/read/Name.ws" /> 

    <jaxws:endpoint id="alphaWrite" 
      implementor="path.to.AlphaWriteImpl" 
      address="/write/Name.ws" /> 
</beans> 

beta.xml

<beans xmlns="http://www.springframework.org/schema/beans" ... > 

    <jaxws:endpoint id="betaRead" 
      implementor="path.to.BetaReadImpl" 
      address="/read/Name.ws" /> 

    <jaxws:endpoint id="betaWrite" 
      implementor="path.to.BetaWriteImpl" 
      address="/write/Name.ws" /> 
</beans> 
+1

http : // localhost : 8080/BetaReadImpl 및 http : // localhost : 8080/AlphaReadImpl – superartsy

+0

과 같은 소모품 엔드 포인트가 있습니까 @ superartsy 예 최근에 발견했습니다. – vault