【问题标题】:Rest API - Handle Special Characters in XML RequestRest API - 处理 XML 请求中的特殊字符
【发布时间】:2018-05-21 11:19:10
【问题描述】:

所以我公开了一个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;
}

我收到以下错误:

“状态”:400,“错误”:“错误请求”,“异常”: "org.springframework.http.converter.HttpMessageNotReadableException", "message": "无法解组到 [SomeMapModel]null;嵌套异常是 javax.xml.bind.UnmarshalException\n - 带有链接异常:\n[org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 41;实体名称必须紧跟实体引用中的“&”。]"

为什么java不能解析带有'&'的XML字段?如何实时处理?

【问题讨论】:

    标签: java xml spring-boot jaxb


    【解决方案1】:

    为什么java不能解析带有'&'的XML字段?

    因为它与其他所有技术一样。 XML 文档不允许包含任何既不是 char ref 的一部分(如 &amp;lt;)也不是转义的 & 字符。作为 XML 约定的一部分,这样的文档必须被拒绝,因为没有合理的理由不拒绝它们。 (如果您想知道,那是因为 XML 提供者知道他们在做 XML,因此他们甚至不应该创建这样一个损坏的 XML 文档来提供,更不用说坚持认为它是可以接受的,一旦指出它是不是。)

    如何实时处理?

    您已经在以唯一可接受的方式处理它:拒绝输入并以 HTTP 400 错误响应错误请求。让请求发送者修复他们的请求。

    供您参考,请求应该是:

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

    【讨论】:

      【解决方案2】:

      简单的解决方案是使用 org.apache.commons.lang.StringEscapeUtils HERE

      @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 值替换它们。

      【讨论】:

      • 转义应该是在解组吧?无论如何,我将返回一个不会发送特殊字符的自定义响应。
      • 在您的映射中public ResponseEntity&lt;String&gt; UpdateSomeThings ResponseEntity 在这里携带什么?它是编组的响应对象吗?
      • 我创建了响应模型,它将返回带有错误或成功消息的 JSON。
      猜你喜欢
      • 2017-04-14
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      相关资源
      最近更新 更多