как я могу добавить заголовки к неудавшемуся ответу веб-службы?

0

Я начинаю создавать веб-сервисы с помощью spring boot + camel, мне удалось сделать ваш ответ, когда он будет успешным, однако я не знаю, как сделать ответ, когда он не работает, я пробовал использовать SoapFault cxf, однако , он не отправляет заголовки, что является ошибкой.

Это ожидаемый ответ

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
     <soap:Header>
      <head:HeaderOut xmlns:head="http://business.com/globalIntegration/header">
         <head:destination>origin</head:destination>
      </head:HeaderOut>
   </soap:Header>
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>SEC3000:Generic Security Error</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

Как я уже упоминал, я попытался с ошибкой мыла отправить заголовки с обмена, но он опускает заголовки. Ответ следующий: (неправильный ответ, потому что заголовки отсутствуют)

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>SEC3000:Generic Security Error</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

Это код, который я использую для сохранения заголовков, но в конце он их не показывает (я думаю, это из-за setFault), однако, если я не оставлю setFault (true), мне не понадобится как неудача

Я оставляю свой код в качестве демонстрации того, что я сделал, но если бы его можно было использовать по-другому, не было бы проблем, поскольку то, что у меня есть, не делает того, что я ожидаю.

Процессор (apache camel)

 @Override
    public void process(Exchange exchange) throws Exception {

        Object exception = exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
        String rspBody = ((HttpOperationFailedException) exception).getResponseBody();

        SoapFault soapFault = soapExceptionMapper.getSoapFault(rspBody);

        String xml = String.format("<?xml version=\"1.0\" encoding=\"utf-8\"?><head:HeaderOut xmlns:head=\"http://business.com/globalIntegration/header\">" +
                        "<head:destination>%s</head:destination>"
                        "</head:HeaderOut>",
                "origin)");


        exchange.getOut().setBody(soapFault);
        exchange.getOut().setFault(true);
        exchange.getOut().setHeader(Header.HEADER_LIST, responseMapper.getSoapHeaders(xml));
    }

сопоставитель методов (заголовок мыла)

 public List<SoapHeader> getSoapHeaders(String xml) throws XMLStreamException {
        String nameSpace = "http://telefonica.com/globalIntegration/header";
        Element documentElement = StaxUtils.read(new StringReader(xml)).getDocumentElement();

        SoapHeader soapHeader = new SoapHeader(QName.valueOf(nameSpace), documentElement, null);
        soapHeader.setDirection(Header.Direction.DIRECTION_OUT);

        List<SoapHeader> headers = new ArrayList<>();
        headers.add(soapHeader);
        return headers;
    }

Буду признателен, если вы поможете мне, рассказав, что я делаю не так, или какой-либо пример, в котором заголовки отображаются в ответе на soapFault, либо с помощью cxf, либо с помощью spring -ws, Gra

0

Мы можем обрабатывать наиболее распространенные клиентские ошибки - в основном сценарии, когда клиент отправляет неверный запрос в API:

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
  MethodArgumentNotValidException ex,
  HttpHeaders headers, 
  HttpStatus status, 
  WebRequest request) {
    List<String> errors = new ArrayList<String>();
    for (FieldError error : ex.getBindingResult().getFieldErrors()) {
        errors.add(error.getField() + ": " + error.getDefaultMessage());
    }
    for (ObjectError error : ex.getBindingResult().getGlobalErrors()) {
        errors.add(error.getObjectName() + ": " + error.getDefaultMessage());
    }
    ApiError apiError = 
  new ApiError(HttpStatus.BAD_REQUEST, ex.getLocalizedMessage(), errors);
    return handleExceptionInternal(
      ex, apiError, headers, apiError.getStatus(), request);
}
Новый участник
Ankit Srivastava is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.