Все работает хорошо, ввод данных, обработка данных с помощью бизнес-логики и возврат данных верны.
Проблема возникает, когда ввод данных не выполняется. не соответствует контракту, например числовое поле, которое отображается в виде буквы, пропускает валидатор и возвращает ошибку мыла.
Я не хочу возвращать ошибку мыла, я хочу вернуть пользовательский объект, указывающий ошибки.
Возможно ли это с помощью этой технологии?
Я прилагаю код, который использую (я пробовал расширить 2 разных класса AbstractSoapInterceptor и AbstractPhaseInterceptor):
Код: Выделить всё
package es.app.soap.interceptores;
import java.util.ArrayList;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
public class SoapFaultInterceptor extends AbstractSoapInterceptor {
public SoapFaultInterceptor() {
super(Phase.PRE_STREAM); //UNMARSHAL
//addBefore(ClientFaultConverter.class.getName());
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
// TODO Auto-generated method stub
System.out.println("SoapFaultInterceptor handleMessage ");
System.out.println("SoapFaultInterceptor handleMessage END ");
}
@Override
public void handleFault(SoapMessage message) {
// TODO Auto-generated method stub
System.out.println("SoapFaultInterceptor handleFault ");
//message.setContent(Exception.class, null);
CustomSoapFaultResponse respError = new CustomSoapFaultResponse();
CustomSoapFaultResponseError error = new CustomSoapFaultResponseError();
error.setCodigo("test code");
error.setDescripcion("test description");
CustomSoapFaultResponseErrores errores = new CustomSoapFaultResponseErrores();
errores.getError().add(error);
respError.setErrores(errores);
// Elimina el SoapFault del mensaje saliente
message.setContent(CustomSoapFaultResponse.class, respError);
System.out.println("SoapFaultInterceptor handleFault END ");
}
}
package es.app.soap.interceptores;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.binding.soap.interceptor.Soap11FaultOutInterceptor;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.springframework.stereotype.Component;
public class CustomAbstractPhaseInterceptor extends AbstractPhaseInterceptor{
public CustomAbstractPhaseInterceptor() {
//super(Phase.SETUP);
super(Phase.PRE_STREAM);
//this.getBefore().add(Soap11FaultOutInterceptor.class.getName());
System.out.println("CustomAbstractPhaseInterceptor Constructor");
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
// TODO Auto-generated method stub
System.out.println("CustomAbstractPhaseInterceptor handleMessage");
}
@Override
public void handleFault(SoapMessage message) {
System.out.println("CustomAbstractPhaseInterceptor handleFault");
//message.setContent(Exception.class, null);
try {
String customSoapResponse = "test error";
SOAPMessage soapMessage;
try {
soapMessage = createSoapMessage(customSoapResponse);
message.setContent(SOAPMessage.class, soapMessage);
//message.getExchange().setOutMessage(message);
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SOAPException | IOException e) {
throw new Fault(e);
}
//message.getInterceptorChain().pause();
}
private SOAPMessage createSoapMessage(String xml) throws SOAPException, IOException, TransformerException {
InputStream inputStream = new ByteArrayInputStream(xml.getBytes());
StreamSource streamSource = new StreamSource(inputStream);
DOMResult domResult = new DOMResult();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(streamSource, domResult);
// Create a SOAPMessage from the transformed DOMResult
SOAPMessage soapMessage = javax.xml.soap.MessageFactory.newInstance().createMessage();
SOAPBody soapBody = soapMessage.getSOAPBody();
soapBody.addDocument((org.w3c.dom.Document) domResult.getNode());
return soapMessage;
}
}
Можно ли избежать ошибки мыла?
Что бы вы ни делали, ответ всегда один и тот же, я прикрепил его ниже:
Код: Выделить всё
soap:Client
Unmarshalling Error: cvc-length-valid: Value 'a' with length = '1' is not facet-valid with respect to length '9' for type 'NameType'.
Код: Выделить всё
Unmarshalling Error: cvc-length-valid: Value 'a' with length = '1' is not facet-valid with respect to length '9' for type 'NameType'.
Я пытался удалить ошибку и создать собственное сообщение, но это тоже не сработало.
Подробнее здесь: https://stackoverflow.com/questions/782 ... apache-cxf
Мобильная версия