Как получить строку XML из POST RequestBody в сгенерированном Swagger коде сервера Spring?

Я хочу создать метод REST API, который получает строку XML, отправленную POST. Я использую Редактор Swagger для разработки своего REST API сверху вниз и для создания кода заглушки сервера. .

Метод POST выглядит так в моем swagger.yaml:

  /models:
    post:
      summary: Store a model.
      description: Stores the XML content of the specified model.
      consumes:
        - application/xml;charset=UTF-8
      parameters:
        - name: model
          in: body
          description: The model XML you want to store
          schema:
            type: string
          required: true
      responses:
        201:
          description: Model stored successfully
          headers:
            location:
              description: URL of the stored model.
              type: string

У меня также есть этот глобальный параметр в файле yaml:

produces:
  - application/json

Когда я использую пункт меню Generate Server > Spring редактора Swagger, для метода POST создается следующий метод интерфейса:

    @ApiOperation(value = "Store a model.", notes = "Stores the XML content of the specified model.", response = Void.class, tags={  })
    @ApiResponses(value = { 
        @ApiResponse(code = 201, message = "Model stored successfully", response = Void.class) })
    @RequestMapping(value = "/models",
        produces = { "application/json" }, 
        consumes = { "application/xml;charset=UTF-8" },
        method = RequestMethod.POST)
    ResponseEntity<Void> modelsPost(

@ApiParam(value = "The model XML you want to store" ,required=true ) @RequestBody String model);

и это соответствующая реализация заглушки:

    public ResponseEntity<Void> modelsPost(
@ApiParam(value = "The model XML you want to store" ,required=true ) @RequestBody String model

) {
        // do some magic!
        return new ResponseEntity<Void>(HttpStatus.OK);
    }

Я использую Postman для отправки некоторого фиктивного XML в метод моей работающей службы Springboot:

Снимок экрана почтальона

Но когда я распечатываю значение model внутри метода реализации с log.debug("Model XML = " + model);, я получаю в журналах такой вывод:

Model XML = ------WebKitFormBoundaryA3o70hOgLFoLLBoY
Content-Disposition: form-data; name="model"

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

Как мне получить только сам XML в значение model? Я хочу, чтобы это было вместо этого в этом примере:

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

Помните, что я не могу просто редактировать сигнатуры методов Java напрямую, потому что редактор Swagger создает их. Если мое определение чванства неверно, что я должен использовать вместо этого для публикации строки XML?

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


person snark    schedule 16.08.2016    source источник


Ответы (2)


В почтальоне переключитесь с данных формы на необработанные и выберите соответствующий тип содержимого (приложение/xml).

Вы должны сделать это, потому что spring ожидает, что ваш объект будет в теле запроса (из-за аннотации @RequestBody к вашему параметру)

person benjamin.d    schedule 16.08.2016
comment
Спасибо - это сработало! Все, что мне нужно было сделать, это поставить <?xml version="1.0" encoding="utf-8"?><Hello></Hello> в необработанное поле, и это то, что было получено службой. Так что параметр model был лишним. - person snark; 17.08.2016

Если у вас есть минимальные преобразователи и вы хотите читать Json/XML как строку, вам также понадобится преобразователь для преобразования типа содержимого в строку. StringHttpMessageConverter делает именно это.

<mvc:annotation-driven
    content-negotiation-manager="contentNegotiationManager">
    <mvc:message-converters register-defaults="false">
        <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="jacksonObjectMapper" />
            <property name="supportedMediaTypes">
                <list>
                    <value>application/json</value>
                </list>
            </property>
        </bean>
        <bean
            class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
            <constructor-arg ref="jaxbMarshaller" />
            <constructor-arg ref="jaxbUnMarshaller" />
            <property name="supportedMediaTypes">
                <list>
                    <value>application/xml</value>
                    <value>text/xml</value>
                </list>
            </property>
        </bean>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/plain</value>
                    <value>application/xml</value> <!-- extract xml as string -->
                </list>
            </property>
            <property name="writeAcceptCharset" value="true" />
        </bean>
person kisna    schedule 11.04.2017