[SPRING] WS SoapFault에 세부 정보 추가하기 : 내 사용자 지정 ExceptionResolver가 사용되지 않았습니다.
SPRINGWS SoapFault에 세부 정보 추가하기 : 내 사용자 지정 ExceptionResolver가 사용되지 않았습니다.
저는 Spring Boot (1.2.4.RELEASE)를 사용하여 웹 서비스를 구축하고 있으며,이 프레임 워크에 대해 아주 새로운 것 같습니다. 특히 예외가 발생하면 "세부 정보"태그를 추가하여 SoapFault 콘텐츠를 사용자 지정하려고합니다.
나는이 기사를 따라 그렇게했다 : http://www.stevideter.com/2009/02/18/of-exceptionresolvers-and-xmlbeans/
여기에 내 예외가 있습니다 :
package foo.bar.exception;
import org.springframework.ws.soap.server.endpoint.annotation.FaultCode;
import org.springframework.ws.soap.server.endpoint.annotation.SoapFault;
@SoapFault(faultCode = FaultCode.SERVER)
public class ServiceException extends Exception {
private static final long serialVersionUID = -1804604596179996724L;
private String tempFaultDetail;
public ServiceException(){
super("ServiceException");
}
public ServiceException(String message) {
super(message);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
public ServiceException(String message, Throwable cause, String fautDetail) {
super(message, cause);
setTempFaultDetail( fautDetail );
}
public String getTempFaultDetail() {
return tempFaultDetail;
}
public void setTempFaultDetail(String tempFaultDetail) {
this.tempFaultDetail = tempFaultDetail;
}
}
여기 내 beans.xml (Java 구성 및 주석으로 처리하려고 시도했지만 올바른 작업을 수행하고 있는지 확실하지 않으므로 XML bean 선언에 백업했습니다).
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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-2.0.xsd">
<bean id="exceptionResolver"
class="foo.bar.ws.DetailSoapFaultDefinitionExceptionResolver">
<property name="defaultFault" value="SERVER" />
<property name="exceptionMappings">
<value>
foo.bar.exception.ServiceException=SERVER,FaultMsg
</value>
</property>
<property name="order" value="1" />
</bean>
</beans>
그리고 내가 정의한 SoapFaultAnnotationExceptionResolver를 재정의하기 위해 작성한 사용자 정의 클래스 (위 기사에서 설명한대로 SoapFaultMappingExceptionResolver를 확장했다.) :
package foo.bar.ws;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.ws.soap.SoapFault;
import org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver;
@Component
public class DetailSoapFaultDefinitionExceptionResolver extends
SoapFaultAnnotationExceptionResolver {
public final static Logger logger = Logger.getLogger( DetailSoapFaultDefinitionExceptionResolver.class );
public DetailSoapFaultDefinitionExceptionResolver() {
super();
// TODO Auto-generated constructor stub
}
@Override
protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
logger.debug("TEST OK !");
}
}
그러나 끝점에서 ServiceException을 throw하면 사용자 정의 클래스의 customizeFault 메소드가 절대로 손상되지 않습니다. 그리고 좋은 이유로, 예외 처리기로 사용되는 클래스가 여전히 SoapFaultAnnotationExceptionResolver이고 내 것이 아닙니다 ...
누구든지 설명을 볼 수 있습니까?
이미 보았습니다.
해결법
-
==============================
1.늘 그렇듯이 온라인에 게시 한 후 1 시간 내 문제를 해결합니다. 나는 일찍 그것을 했어야했다!
늘 그렇듯이 온라인에 게시 한 후 1 시간 내 문제를 해결합니다. 나는 일찍 그것을 했어야했다!
재정의를 시도한 bean 이름 / id가 올바르지 않습니다. 방대한 양의 org.springframework.beans 디버그 로그를 스캔 한 후에 올바른 bean 이름이 soapFaultAnnotationExceptionResolver라는 것을 발견했습니다.
또한 Java 형식으로 구성을 변환 할 수있었습니다.
package foo.bar.ws; // Skipping imports... /** * WS configuration and WSDL definition */ @EnableWs @Configuration public class WebServiceConfig extends WsConfigurerAdapter { public final static Logger logger = Logger.getLogger( WebServiceConfig.class ); // Skipping other bean declarations... @Bean(name = "soapFaultAnnotationExceptionResolver") public DetailSoapFaultDefinitionExceptionResolver exceptionResolver( ApplicationContext applicationContext ){ DetailSoapFaultDefinitionExceptionResolver exceptionResolver = new DetailSoapFaultDefinitionExceptionResolver(); SoapFaultDefinition soapFaultDefinition = new SoapFaultDefinition(); soapFaultDefinition.setFaultCode( SoapFaultDefinition.SERVER ); exceptionResolver.setDefaultFault( soapFaultDefinition ); return exceptionResolver; } }
-
==============================
2.나는이 응답이 구식이지만 어쩌면 다른 사람을 위해 일한다는 것을 알고있다.
나는이 응답이 구식이지만 어쩌면 다른 사람을 위해 일한다는 것을 알고있다.
MessageDispatcher는 기본적으로 SimpleSoapExceptionResolver와 SoapFaultAnnotationExceptionResolver라는 두 개의 Resolver를 발생시킵니다. 사용자 정의 코드와 오류 메시지로 비누 오류를 가져 오려면 먼저 SoapFaultAnnotationExceptionResolver를 가져온 다음 SimpleSoapExceptionResolver를 가져와야합니다.
1 단계. 콩 구성 파일에 해당 :
<bean class="org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver"> <property name="order" value="1"/> </bean> <bean class="org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver"> <property name="order" value="2"/> </bean>
2 단계. 다음과 같이 예외를 선언하십시오.
@SoapFault(faultCode = FaultCode.CUSTOM,locale="en",faultStringOrReason = "CUSTOM_MESSAGE",customFaultCode="YOUR_NAMESPACE + YOUR_CUSTOM_CODE") public class DeclaracionNotFoundException extends BusinessException { public DeclaracionNotFoundException(){ super(); } public DeclaracionNotFoundException(String message) { super(message); } }
3 단계.
정상적으로 코드에서 Exception을 발생시킵니다.
새로운 DeclaracionNotFoundException ()을 던졌습니다. // faultStringOrReason의 기본 메시지 사용 또는 새로운 DeclaracionNotFoundException을 던졌습니다 ( "Ops !!!"); // 다른 메시지와 함께
그것은 나를 위해 일하고, 나는 다음과 같은 것을 가지고있다.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode xmlns:ns0="http://com.example">ns0:4</faultcode> <faultstring xml:lang="en">Ops !!!</faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
faultCode = 4 및 faultString = Ops를 정의했습니다.
문안 인사
from https://stackoverflow.com/questions/31069114/adding-detail-in-a-ws-soapfault-my-custom-exceptionresolver-is-not-used by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring @Scheduled 작업이 두 번 실행됩니다. (0) | 2019.01.23 |
---|---|
[SPRING] Spring 보안 jdbcAuthentication은 기본 롤 처리와 함께 작동하지 않습니다. (0) | 2019.01.23 |
[SPRING] 복합 기본 키로 봄 데이터 휴식 (0) | 2019.01.23 |
[SPRING] Spring 트랜잭션 관리자와 다중 쓰레드 (0) | 2019.01.22 |
[SPRING] AspectJ와의 Spring / @Transactional은 완전히 무시된다. (0) | 2019.01.22 |