Избегайте ответа на ошибку мыла (org.apache.cxf)Apache

Ответить
Anonymous
 Избегайте ответа на ошибку мыла (org.apache.cxf)

Сообщение Anonymous »

Я создаю сервис Soap с помощью org.apache.cxf.
Все работает хорошо, ввод данных, обработка данных с помощью бизнес-логики и возврат данных верны.
Проблема возникает, когда ввод данных не выполняется. не соответствует контракту, например числовое поле, которое отображается в виде буквы, пропускает валидатор и возвращает ошибку мыла.
Я не хочу возвращать ошибку мыла, я хочу вернуть пользовательский объект, указывающий ошибки.
Возможно ли это с помощью этой технологии?
Я прилагаю код, который использую (я пробовал расширить 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;
}

}
Я пробовал несколько способов поиска в Google, но ни один из них не помог.
Можно ли избежать ошибки мыла?
Что бы вы ни делали, ответ всегда один и тот же, я прикрепил его ниже:

Код: Выделить всё



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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Apache»