cxf 와 Spring 결합 게시 서버 와 클 라 이언 트 및 차단기 설정 및 사용
9831 단어 spring
사실 인터넷 에는 CXF 가 Spring 과 어떻게 결합 하여 서 비 스 를 발표 하 는 지, 테스트 클 라 이언 트 를 어떻게 구축 하 는 지 에 대한 이야기 가 많다.그러나 종이 에 있 는 것 은 결국 얕 은 것 이다. 이번 프로젝트 가 만 났 고 스스로 실천 을 했 으 니 기록 을 하 자.기록 은 최고의 성장 이다.그리고 그 중 에 어 처 구 니 없 는 이상 한 사건 을 만 났 다.
사고
정상 적 인 자바 인터페이스 및 구현 클래스 를 실현 합 니 다.업무 실현 논 리 는 잠시 표시 하지 않 는 다. 이것 은 이 문장의 내용 이 아니다.
다음 과 같다.
com.***.fax.facade.tomi.CallBackNotifyFacade
com.***.fax.facade.tomi.CallBackNotifyFacadeImpl
CallBack Notify Facade 에 다음 과 같은 주 해 를 추가 합 니 다: @ WebService
CallBack Notify FacadeImpl 에 다음 과 같은 주 해 를 추가 합 니 다.
@WebService(endpointInterface = "com.qunar.fax.facade.tomi.CallBackNotifyFacade")
@Service("callBackNotifyFacadeImpl")
xml 설정 은 다음 과 같 습 니 다:
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<!-- http://localhost:8081/callBackNotifyFacade/callBackNotifyFacade?wsdl -->
<jaxws:endpoint
id="callBackNotifyFacade"
implementor="com.***.fax.facade.tomi.CallBackNotifyFacadeImpl"
address="/callBackNotifyFacade" >
<jaxws:inInterceptors>
<bean class="com.***.fax.facade.interceptor.CxfLoggingInInterceptor"/>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="com.***.fax.facade.interceptor.CxfLoggingOutInterceptor" />
</jaxws:outInterceptors>
</jaxws:endpoint>
그 중에서 CxfLoggingInInterceptor 와 CxfLoggingOutInterceptor 는 각각 입구 와 출구 차단기 이다.코드 는 다음 과 같 습 니 다:
public class CxfLoggingInInterceptor extends AbstractLoggingInterceptor {
private static final Logger LOG = LogUtils.getLogger(LoggingInInterceptor.class);
public CxfLoggingInInterceptor() {
super(Phase.RECEIVE);
}
@Override
protected Logger getLogger() {
return LOG;
}
@Override
public void handleMessage(Message message) throws Fault {
//
long startTime = SystemTimer.currentTimeMillis();
NDC.push(startTime + "_" + Thread.currentThread().getId());
}
}
public class CxfLoggingOutInterceptor extends AbstractLoggingInterceptor {
private static final Logger LOG = LogUtils.getLogger(CxfLoggingOutInterceptor.class);
public CxfLoggingOutInterceptor() {
super(Phase.PRE_STREAM);
}
@Override
protected Logger getLogger() {
return LOG;
}
@Override
public void handleMessage(Message message) throws Fault {
// ,
NDC.pop();
NDC.remove();
NDC.clear();
}
}
pom. xml 설정 정보
<!-- cxf -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf</artifactId>
<version>${cxf.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
<exclusions>
<exclusion>
<artifactId>geronimo-javamail_1.4_spec</artifactId>
<groupId>org.apache.geronimo.specs</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
cxf. version 2.7.0
서버 코드 는 여기까지 입 니 다.
3. 클 라 이언 트 테스트 코드
/**
*
*/
@Test
public void testSendFaxCallBack(){
try{
//
String wsdlUrl="fax/test/callback.wsdl";
JaxWsDynamicClientFactory dynamicClient = JaxWsDynamicClientFactory.newInstance();
Client client = dynamicClient.createClient(wsdlUrl);
//
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout( 36000 );
httpClientPolicy.setAllowChunking( false );
httpClientPolicy.setReceiveTimeout( 32000 );
http.setClient(httpClientPolicy);
//
String xml="。。。。。";
// ,
Object[] res = client.invoke("sendCallBack", xml);
System.out.println("response: " + res[0]);
}catch (Exception e){
logger.warn("",e);
}
}
4. 개발 과정 에 나타 난 이상
1. 이상 정 보 는 다음 과 같다.
HTTP
Status 500 - Servlet.init() for servlet CXFServlet threw exception
type Exception report
message Servlet.init() for servlet CXFServlet threw exception
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Servlet.init() for servlet CXFServlet threw exception
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:662)
root cause
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cxf' is defined
org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:568)
org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1099)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:278)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1121)
org.apache.cxf.transport.servlet.CXFServlet.loadBus(CXFServlet.java:77)
org.apache.cxf.transport.servlet.CXFNonSpringServlet.init(CXFNonSpringServlet.java:71)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
원인, 아래 설정 정보 가 도입 되 지 않 았 습 니 다.
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
2. 이상 정 보 는 다음 과 같다.
Caused by: org.apache.cxf.binding.soap.SoapFault: Error reading XMLStreamReader.
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:70)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:96)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:65)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:429)
원인: 이 오 류 는 나 로 하여 금 가장 두서 가 없 게 하 는 것 이다. 모든 설정 이 정상 적 이 고 로 컬 테스트 도 정상 적 이지 만 서버 에 오 르 기만 하면 오 류 를 보고 하기 때문이다.
많은 이 유 를 찾 아 보 았 습 니 다. 많은 버 전 을 바 꾸 었 는데 모두 무효 입 니 다. 마지막 으로 우연히 발 표 된 스 크 립 트 job 에 checkurl 이 있 는 것 을 발 견 했 습 니 다. 최종 발표 가 성 공 했 는 지 확인 하기 위해 서 저 는 wdl 이 발표 한 url 로 썼 습 니 다. 그 결과 ws 서비스 가 완전히 일어나 지 않 았 을 때 이 url 은 계속 재 시도 되 었 습 니 다.이상 을 초래 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.