Rest API - обрабатывает специальные символы в запросе XML - PullRequest
0 голосов
/ 21 мая 2018

Итак, я выставил Rest API, где полезная нагрузка запроса будет в application/xml.

Пример полезной нагрузки:

<NAMES>
  <NAME ID="P2" DESCRIPTION="Johnson & Johnsons" />
</NAMES>

Код:

@PostMapping(value = "/UpdateSomeThings", consumes = { MediaType.APPLICATION_XML })
public ResponseEntity<SomeResponseModel> UpdateSomeThings(
        @PathVariable("mId") String mId, @Valid @RequestBody SomeMapModel reqBody) {
    .
    .
    .
    .
    return new ResponseEntity<>(response, HttpStatus.OK);
}

Классы моделей:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "NAMES")
@Data
public class SomeMapModel {

    @XmlElement(name = "NAME")
    private ChildModel[] chld;

}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "NAME")
@Data
public class ChildModel {

    @XmlAttribute(name = "ID")
    private String id;

    @XmlAttribute(name = "DESCRIPTION")
    private String desc;
}

Я получаю следующую ошибку:

«status»: 400, «error»: «Bad Request», «exception»: «org.springframework.http.converter.HttpMessageNotReadableException», «message»: «Не удалось отменить сортировку для [SomeMapModel] null; вложенное исключение равноjavax.xml.bind.UnmarshalException \ n - со связанным исключением: \ n [org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 41; имя объекта должно сразу следовать за «&» в ссылке на объект.] "

Почему java не может разобрать поле XML с '&' в нем?Как я могу справиться с этим в режиме реального времени?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Почему Java не может разобрать поле XML с '&' в нем?

Потому что это, как и любые другие технологии.Не допускается, чтобы документ XML содержал символы &, которые не являются ни частью символа ref, например &lt;, ни экранированные.Такой документ должен быть отклонен как часть соглашения XML и потому, что нет рациональных аргументов, чтобы не отклонять их.(В случае, если вам интересно, это потому, что провайдер XML знает, что он делает XML, и поэтому у него даже не должно быть возможности создать такой сломанный XML-документ, не говоря уже о том, чтобы он был приемлемым, как только указал, что этонет.)

Как я могу справиться с этим в режиме реального времени?

Вы уже обрабатываете это единственно приемлемым способом: отказом от ввода и ответом с помощьюОшибка HTTP 400, неверный запрос.Пусть отправитель запроса исправит свои запросы.

Для вашей информации, запрос должен был быть:

<NAMES>
  <NAME ID="P2" DESCRIPTION="Johnson &amp; Johnsons" />
</NAMES>
0 голосов
/ 21 мая 2018

Простым решением будет использование org.apache.commons.lang.StringEscapeUtils ЗДЕСЬ

@PostMapping(value = "/UpdateSomeThings", consumes = { MediaType.APPLICATION_XML })
public ResponseEntity<String> UpdateSomeThings(
        @PathVariable("mId") String mId, @Valid @RequestBody SomeMapModel reqBody) {
    .
    .
    .
    .
    return new ResponseEntity<>(StringEscapeUtils.escapeXml(response), HttpStatus.OK);
}

Предоставляется служебный методэкранировать специальные символы в XML и заменять их значениями Unicode.

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