복붙노트

[SPRING] Apache Camel 및 웹 서비스

SPRING

Apache Camel 및 웹 서비스

Apache Camel을 WSDL을 제공하는 웹 서비스와 통합하여 클래스를 생성 한 후 나중에 메소드를 호출하여 일부 요청을 리턴하는 방법을 이해하려고합니다.

나는 camel-spring-ws와 camel-cxf 패키지에 대해 조금 공부했습니다. Spring Web Services Component는 WSDL 사용을 지원하지 않지만 CXF는 지원하지만 CXF에서 호스트되는 JAX-WS 서비스와의 연결 만 지원합니다.

고객으로부터 WSDL을 받으면 CXF를 사용할 수 있습니까? 또는 자신의 메서드를 사용하기 위해 사용자 지정 구성 요소를 만들어야합니까?

지금까지 내가 구현할 수있는 가장 간단한 방법은 원격 웹 서비스를 호출하는 Process 또는 Bean을 만드는 것입니다.

원격 웹 서비스를 호출하기 위해 제작자를 구현하려고했습니다. 내 beans.xml :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:cxf="http://camel.apache.org/schema/cxf"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd 
       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml"/> 

    <cxf:cxfEndpoint 
        id="osvEndpoint" 
        address="http://10.193.1.90:8767/" 
        serviceClass="siemens_hiq8000.SiemensHiq8000PortType"/> 

    <bean id="osvWebServiceProcessor" class="br.com.willianantunes.processor.OsvWebServiceProcessor" />

</beans>

내 경로 :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

    <routeContext id="osvWebServiceInvoke" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="quartz2://test?cron=0/10+*+*+*+*+?"/>
            <process ref="osvWebServiceProcessor" />
            <to uri="cxf:bean:osvEndpoint"/>
            <to uri="log:live?level=INFO" />
        </route>
    </routeContext>

</beans>

그리고 내 프로세서 :

public class OsvWebServiceProcessor implements Processor
{
    @Override
    public void process(Exchange exchange) throws Exception
    {
        Message inMessage = exchange.getIn();

        // The method to be called
        inMessage.setHeader(CxfConstants.OPERATION_NAME, "getVersion");

        // Parameters to be passed into the web service
        List<Object> params = new ArrayList<Object>();
        ResultCodeStructHolder resultCodeStructHolder = new ResultCodeStructHolder();
        VersionDataHolder versionDataHolder = new VersionDataHolder();
        params.add(resultCodeStructHolder);
        params.add(versionDataHolder);
        inMessage.setBody(params);
    }
}

getVersion 메소드에는 다음과 같은 몇 가지 매개 변수가 필요합니다.

public void getVersion(siemens_hiq8000.holders.ResultCodeStructHolder result, 
siemens_hiq8000.holders.VersionDataHolder versionData) throws java.rmi.RemoteException;

어떻게 그들을 전달할 수 있습니까? 이 소지자는 웹 서비스의 응답으로 채워야합니다. 내 프로젝트를 실행할 때 다음과 같은 오류가 발생합니다.

[main] INFO org.apache.cxf.service.factory.ReflectionServiceFactoryBean - Creating Service {http://siemens_hiq8000/}SiemensHiq8000PortType from class siemens_hiq8000.SiemensHiq8000PortType
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.cxf.wsdl11.WSDLEndpointFactory.createEndpointInfo(Lorg/apache/cxf/service/model/ServiceInfo;Lorg/apache/cxf/service/model/BindingInfo;Ljava/util/List;)Lorg/apache/cxf/service/model/EndpointInfo;
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpointInfo(AbstractWSDLBasedEndpointFactory.java:287)
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:144)
    at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:91)
    at org.apache.camel.component.cxf.CxfSpringEndpoint.createClient(CxfSpringEndpoint.java:116)
    at org.apache.camel.component.cxf.CxfProducer.doStart(CxfProducer.java:76)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:2869)
    at org.apache.camel.impl.DefaultCamelContext.doAddService(DefaultCamelContext.java:1097)
    at org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1058)
    at org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:405)
    at org.apache.camel.impl.ProducerCache.acquireProducer(ProducerCache.java:123)
    at org.apache.camel.processor.SendProcessor.doStart(SendProcessor.java:219)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.DelegateAsyncProcessor.doStart(DelegateAsyncProcessor.java:79)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.RedeliveryErrorHandler.doStart(RedeliveryErrorHandler.java:1272)
    at org.apache.camel.support.ChildServiceSupport.start(ChildServiceSupport.java:44)
    at org.apache.camel.support.ChildServiceSupport.start(ChildServiceSupport.java:31)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.interceptor.DefaultChannel.doStart(DefaultChannel.java:153)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:61)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.MulticastProcessor.doStart(MulticastProcessor.java:1060)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.DelegateAsyncProcessor.doStart(DelegateAsyncProcessor.java:79)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.impl.RouteService.startChildService(RouteService.java:340)
    at org.apache.camel.impl.RouteService.warmUp(RouteService.java:182)
    at org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:3090)
    at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3020)
    at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:2797)
    at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:2653)
    at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:167)
    at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2467)
    at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2463)
    at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:2486)
    at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:2463)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:2432)
    at org.apache.camel.spring.SpringCamelContext.maybeStart(SpringCamelContext.java:255)
    at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:121)
    at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:332)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:151)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:128)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:331)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:773)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
    at org.apache.camel.spring.Main.createDefaultApplicationContext(Main.java:216)
    at org.apache.camel.spring.Main.doStart(Main.java:156)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.main.MainSupport.run(MainSupport.java:150)
    at br.com.willianantunes.test.Program.main(Program.java:12)

낙타 cxf가 제작자처럼 행동하기를 원하는 사람들은 다음 단계를 따르십시오.

wsdl2java -client -d "TargetFolderHere"-autoNameResolution "OpenScape-Voice_V8.00.28.01.wsdl"

그리고 로그는 다음을 인쇄합니다.

- Quartz scheduler 'DefaultQuartzScheduler-main-application' initialized from an externally provided properties instance.
- Quartz scheduler version: 2.2.1
- Job Camel_main-application.test (triggerType=CronTriggerImpl, jobClass=CamelJob) is scheduled. Next fire date is Tue Mar 31 09:12:00 BRT 2015
- AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance.
- StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
- Creating Service {urn:openscape-voice}openscape_voice from WSDL: OpenScape-Voice_V8.00.28.01.wsdl
- Could not find endpoint/port for {urn:openscape-voice}openscape_voicePortTypePort in wsdl. Using {urn:openscape-voice}openscape_voice.
- Route: route1 started and consuming from: Endpoint[quartz2://test?cron=0%2F10+*+*+*+*+%3F]
- Starting scheduler.
- Scheduler DefaultQuartzScheduler-main-application_$_NON_CLUSTERED started.
- Total 1 routes, of which 1 is started.
- Apache Camel 2.15.0 (CamelContext: main-application) started in 10.759 seconds
- Exchange[ExchangePattern: InOnly, BodyType: org.apache.cxf.message.MessageContentsList, Body: [null, javax.xml.ws.Holder@508696f5, javax.xml.ws.Holder@333cf1ba]]

CXF 종속성에 몇 가지 문제점이 있었으므로 여기에 내 pom.xml이 있습니다.

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cxf</artifactId>
    <version>${camel-version}</version>
</dependency>
<!-- Apache CXF -->
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    <version>${cxf.version}</version>
</dependency>   
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-bindings-soap</artifactId>
    <version>${cxf.version}</version>
</dependency>   
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>jsr311-api</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- End of Apache CXF -->

새로운 프로세서 나 빈을 디자인하여 SOAP 메시지가 아닌 순수한 SOAP 메시지 인 본문 메시지를 얻을 수있다. 그러나 POJO는 웹 서비스에서 사용된다.

@ am 비어 어인이 제공 한 대답은 OK이며 내 목적에도 부합 할 수 있습니다.

해결법

  1. ==============================

    1.웹 서비스의 첫 번째 또는 하향식 개발 계약을 언급하고 있습니다. 이 접근법에서는 WSDL 정의에서 스텁 코드를 생성하고 개발시 이러한 클래스 등을 사용합니다. 필자는이 작업을 많이했으며 닷넷, 자바, PHP 및 델파이 (Delphi는 WSI 규격을 준수하지 않아도 작동하지 않음)에서 생성 된 서비스의 WSDL을 사용했습니다.

    웹 서비스의 첫 번째 또는 하향식 개발 계약을 언급하고 있습니다. 이 접근법에서는 WSDL 정의에서 스텁 코드를 생성하고 개발시 이러한 클래스 등을 사용합니다. 필자는이 작업을 많이했으며 닷넷, 자바, PHP 및 델파이 (Delphi는 WSI 규격을 준수하지 않아도 작동하지 않음)에서 생성 된 서비스의 WSDL을 사용했습니다.

    CXF는 라이브러리를 가리킬 수있는 모든 WSDL로부터 클래스를 생성합니다. 우선 Maven POM 파일에 항목을 추가하여 Maven에게 WSDL의 클래스를 생성하도록 지시해야한다.

    POM 파일에 다음을 추가하십시오.

    <plugin>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-codegen-plugin</artifactId>
        <version>get the latest version or the version you want</version>
        <executions>
            <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
    
                <sourceRoot>
                ${basedir}/target/generated/src/main/java
                </sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                    <wsdl>
                    URI/FILE PATH OF WSDL HERE
                    </wsdl>
                    <extraargs>
                    <extraarg>-impl</extraarg> <-- use this if you want to implement the service i.e. create it
                    <extraarg>-client</extraarg> <-- us this if you want to generate a client for the service.
                    </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
            <goal>wsdl2java</goal>
            </goals>
            </execution>
        </executions>
    </plugin>
    

    이제이 파일을 사용하기 위해 필요한 스텁 클래스를 생성하기 위해 maven goal mvn generate-source를 실행시킬 수 있습니다.

    나는 보통 생산 또는 소비하는 대부분의 웹 서비스가 다소 복잡한 데이터 구조를 가지기 때문에 실제 구현을 수행하기 위해 프로세서 / 빈에 포함시킨다. 그러나 이것은 실제로 서비스에 달려 있습니다.

    간단히 말해서 CXF를 사용하여 거의 (Delphi guys는 듣고 있습니까?) 웹 서비스에서 스텁 클래스를 생성 한 다음 프로세서에서 이러한 생성 된 클래스를 사용하여 클라이언트 및 서버를 구현할 수 있습니다.

    최신 정보:

    위의 예를 기반으로 올바른 방향으로 가고 있습니다. 우선 중요한 개념 인 낙타에서 CXF에 관해 논의하고 싶습니다. 다음 코드를 볼 때 CXF 빈은 다른 빈과 약간 다릅니다.

    <from uri="file://....."/>
    <to uri="mock"/>
    

    파일 구성 요소는 결국 파일을 생성하는 생산자이며 모의 구성 요소는 파일 구성 요소에서 생성 한 데이터를 취하여 작업을 수행하는 데 소비하므로 소비자입니다.

    웹 서비스는이 개념을 약간 왜곡합니다. 다음과 같은 경로가있을 때 :

    cxf bean은 웹 서비스를 호출 할 때 프로듀서라고합니다. 소비자 또는 경로의 부분에서 cxf bean을 사용할 때 흥미 롭습니다.

    다음은 웹 서비스 소비자의 예입니다.

    <from uri="cxf:bean:someService" />
    

    CXF 빈은 웹 서비스 호출을 소비 한 다음 여러 다른 부분으로 메시지를 보냅니다. 이를 통해 FTP 서버에서 파일을 다운로드하고 JDBC 호출로 내용을 풍부하게 한 다음 웹 시스템으로 SAP 시스템에 대해 강화 된 데이터를 처리하는 등 매우 복잡한 작업을 노출 할 수 있습니다. 귀하의 경로는 의 cxf 빈을 서비스로서 노출시키고 나머지 경로는 모든 통합을 수행 할 수 있지만 웹 서비스로 공개됩니다. 아주 강력한 개념.

    귀하의 경우 웹 서비스 빈은 제작자 또는 클라이언트입니다. 나는 소비하는 te 서비스가 다소 복잡 할 수 있기 때문에 일반적으로 클라이언트 용 cxf beans를 사용하지 않으며 이러한 경우를 처리하기 위해 Java의 모든 기능이 필요합니다. 그래서 나는 이렇게하는 법을 보여줄 것입니다.

    그래서 제 세상에서 나는 다음의 낙타 루트를 할 것입니다 :

    <routeContext id="osvWebServiceInvoke" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="quartz2://test?cron=0/10+*+*+*+*+?"/>
            <process ref="osvWebServiceProcessor" />
            <to uri="log:live?level=INFO" />
        </route>
    </routeContext>
    

    내 프로세서 빈은 다음과 같이 바뀔 것이다.

    public class OsvWebServiceProcessor implements Processor
    {
        @Override
        public void process(Exchange exchange) throws Exception
        {
            Message inMessage = exchange.getIn();
    
    
    
           /*
                  SInce i dont have access to the WSDL and XSD I cant say how the following code will look but essentially you would need to call the web-service here in Java code and get the result back.
    
           */
          outSOAPMsg=  siemens_hiq8000.SiemensHiq8000PortType.OperationName(inSOAPMsg)
          //set the reply into the inbody and send onto other components for processing.
          inMessage.setBody(outSOAPMsg);
    
      }
    }
    

    귀하의 코드를 보면 스텁 클래스가 올바르게 생성되지 않은 것으로 나타났습니다. 내 게시물에 설명 된 항목을 POM 파일에 추가 할 것을 강력히 권합니다. WSDL 및 XSD 파일 중 일부를 게시 할 수 있다면 더 자세한 설명을 제공 할 수 있습니다.

  2. ==============================

    2.나의 주요 책임 중 하나는 낙타를 클라이언트로 사용하여 다른 웹 서비스를 사용하는 것입니다. 이것은 내가 일반적으로 사용하는 접근 방식이며, 매번 매력과 같이 작동하는 어떤 문제에도 결코 빠지지 않았습니다.

    나의 주요 책임 중 하나는 낙타를 클라이언트로 사용하여 다른 웹 서비스를 사용하는 것입니다. 이것은 내가 일반적으로 사용하는 접근 방식이며, 매번 매력과 같이 작동하는 어떤 문제에도 결코 빠지지 않았습니다.

    1) camel-config.xml 파일에서 엔드 포인트를 정의하십시오.

    < bean id = "service_name_CXFEndpoint"class = "org.apache.camel.component.cxf.CxfEndpoint"/>

    2) 웹 서비스 사용 경로의 구성 파일에 정의 된 끝점을 사용합니다.

    개인 문자열 CXF_SERVICE_ENDPOINT =       "cxf : bean : service_name_CXFEndpoint? address = wsdl_uri_location & serviceClass = service_name_from_the_stubs & loggingFeatureEnabled = true";

    서비스 이름의 경우 wsdl의 내용을 복사하여 .wsdl 파일에 붙여넣고 webservice 클라이언트를 생성해야합니다. 이렇게하려면 wsdl 파일> webservices> 클라이언트 생성을 마우스 오른쪽 버튼으로 클릭해야합니다. 그런 다음 런타임에 JbossWS를 선택해야합니다 (환경 설정에서 JbossWS를 먼저 설정해야합니다). 스텁이 생성되면 기본 서비스 클래스를 찾습니다. 그런 다음 전체 위치를 복사하십시오 (예 : com.test에있는 WebServiceClass라는 클래스는 serviceClass = com.test.WebService.class가됩니다)

    3) 소비를위한 라우팅 정의 :

    from("direct:web_service")
    .routeId("service_name")
    .bean(ServiceWSProcessor,"processRequest")
    .to(CXF_SERVICE_ENDPOINT)
    .bean(ServiceWSProcessor,"processResponse")
    .end();
    

    이제이 프로세서에 요청을 보내면이 프로세서가 웹 서비스 끝점으로 이동하여 응답을 보냅니다.

    4) 요청 응답을위한 프로세서를 작성하십시오 (이 경우 serviceWS 프로세서).

    @Component(value="serviceWSProcessor")
    public class ServiceWSProcessor {
    
      private static final Logger LOGGER = LoggerFactory.getLogger(ServiceWSProcessor.class);
    
      public void processRequest(Exchange exchange) throws Exception {
    
        Message in = exchange.getIn();
        Message out = exchange.getOut();
    
        try {
    
          LOGGER.info("Service - START");
    
          Request Request = in.getBody(Request.class);
    
          //This depends on your WSDL File. Test the process in SOAP UI and see how the request looks like and code
          //accordingly.
    
          List<Object> list = new ArrayList<Object>();
          list.add(header);
          list.add(body);
          //for this, you need to check the service for what are the parameters for that method and what response its expecting.
    
          out.setHeader(CxfConstants.OPERATION_NAME, "method_name");
          out.setBody(list);
    
        } 
        catch (Exception e) {
          e.printStackTrace();
        }
    
      }
    
      public void processResponse(Exchange exchange) throws Exception {
    
        Message in = exchange.getIn();
        Message out = exchange.getOut();
    
        try {
          Response response = null; //Code this based on what response you should set to the final body. check the message
          //contents list in debug mode to see what response you are getting.
    
          try {
            MessageContentsList result = (MessageContentsList) in.getBody();
            if (result != null) {
              response = (Response)result.get(0);
    
              out.setHeader(Constants.HEADER_SERVICE_RESPONSE_SUCCESS, Constants.SERVICE_RESPONSE_SUCCESS_Y);
            } else {
              out.setHeader(Constants.HEADER_SERVICE_RESPONSE_SUCCESS, Constants.SERVICE_RESPONSE_SUCCESS_N);
            }
    
          } catch (Exception e) {
            e.printStackTrace();
            out.setHeader(Constants.HEADER_SERVICE_RESPONSE_SUCCESS, Constants.SERVICE_RESPONSE_SUCCESS_N);
          }
          LOGGER.info("Service - END");
          out.setBody(response));
        } 
        catch (Exception e) {
          LOGGER.error("Service - ERROR");
          out.setBody(e.getMessage());
        } 
    
      }
    
    }
    

    낙타 및 봄 ws에 필요한 종속성 목록을 보려면이 페이지를 확인하십시오.

    https://github.com/gauthamhs/Java/blob/master/JavaEE/Dependencies-Important-Camel-Spring.xml

    추가 도움이 필요하거나 걱정이되는 경우 알려주십시오.

    안부, Gautam

  3. from https://stackoverflow.com/questions/29276308/apache-camel-and-web-services by cc-by-sa and MIT license