Spring выдает HTTP Status 400 при получении запроса мыла с объявлением xml со специальными символами после косой черты - PullRequest
0 голосов
/ 03 ноября 2018

Я получаю xml почтовый запрос от моего поставщика с декларацией этого формата.

<?xml version=\"1.0\" encoding=\"utf-8\"?>

При таком типе объявления xml (я использую Spring MVC с JAXB) я получаю ошибку HTTP Status 400, которая гласит, что "The request sent by the client was syntactically incorrect." Я попытался отправить тот же запрос на свой сайт с помощью почтальона, и я получил та же самая ошибка.

Но при изменении определения xml путем удаления всех обратных косых черт (см. Ниже)

<?xml version="1.0" encoding="utf-8"?>

ошибка исчезает, и я получаю правильный ответ с HTTP Status 200, ОК. Мой вопрос заключается в том, как я могу перехватить этот запрос и изменить объявление xml, удалив прямые косые черты (мой поставщик не выполняет изменение этого с их конца).

Ниже приведен образец моего контроллера

@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST}, value ="/listeningurl", consumes = "application/xml", produces = "application/xml") 
     public ResponseObject lodgementNotifications(@RequestBody RequesObject reqObject)
     {

        //do stuffs with reqObject;
                // Initialize ResponseObject
              return responseObject

    }

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Мне удалось решить проблему. Я должен был получить запрос xml в формате String, убрать обратную косую черту, а затем распаковать его в соответствующий объект. Спасибо @Harry Coder за подсказки. Вот решение, которое сработало для меня.

@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST}, value ="/listeningurl", consumes = "application/xml", produces = "application/xml") 
     public ResponseObject lodgementNotifications(@RequestBody String reqObjectXMLStr)
     {

          //Replace the backslashes from the xml string
          String cleanReqObjectXMLStr = reqObjectXMLStr.replaceAll("\\\\", "");

        //Unmarshal the string into the corresponding object using JAXB library 
         RequestObject reqObject = JAXB.unmarshal(new StringReader(cleanReqObjectXMLStr), RequestObject.class);

        //do stuffs with reqObject;

                // Initialize and set ResponseObject
              return responseObject

    }
0 голосов
/ 03 ноября 2018

Вы можете расширить HandlerInterceptorAdapter, что:

Абстрактный класс адаптера для интерфейса AsyncHandlerInterceptor, для упрощенная реализация перехватчиков «только-только / после-только».

@Component
public class MyHandlerInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // then access your request body (xml content) to update it
        // see link bellow for how to retrieve an xml content from the HttpServletRequest
        return super.preHandle(request, response, handler);
    }
}

После этого вы переопределяете addInteceptors из WebMvcConfigurerAdapter, создавая собственный класс, который расширяется от WebMvcConfigurerAdapter:

@Configuration
public class CustomWebMvc extends WebMvcConfigurerAdapter {

    @Autowired
    MyHandlerInterceptor myHandlerInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myHandlerInterceptor);
        super.addInterceptors(registry);
    }
}

Чтобы узнать, как извлечь содержимое XML из вашего запроса HttpServletRequest, прочитайте это Получить отправленный XML из объекта HttpServletRequest


Редактировать

Если ваша цель состоит в том, чтобы просто получить тело http ( xml content ) и затем делать то, что вы хотите с ним внутри вашего контроллера, вы можете просто вставить InputStream или Reader в Метод обработчика @RequestMapping (который является методом вашего контроллера) примерно так:

@PostMapping(value = "/topics/xml", consumes = "application/xml")
public void getXmlRequest(InputStream data) throws IOException {
    String requestBody = IOUtils.toString(data);
    // format the xml and do something with it
}

Spring Web Doc: Методы обработки :

@ Методы-обработчики RequestMapping имеют гибкую сигнатуру и могут выбирать из диапазона поддерживаемых аргументов метода контроллера и возвращаемых значений. enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...