使用特殊字符的 Java Restful 服务编码

标签 java xml rest encoding

我在 POST 请求时遇到问题。我必须接收 XML 消息并使用 JAXB 对其进行解析。 Everithing 工作正常,但是当消息中包含特殊字符时,例如

<?xml version="1.0" encoding="UTF-8"?>
<sending>
    <sms>
        <message>España</message>
    </sms>
</sending>

它抛出错误请求错误 (400) 客户端发送的请求在语法上不正确(错误请求)。

这是我处理 xml 消息的代码

@POST
@Path("smsSendPost")
@Produces(MediaType.APPLICATION_XML)
public Response smsSendPost(JAXBElement<Sending> xml){
    Sending sending = xml.getValue();

    //Process the message
}

我正在使用tomcat来测试它。

谁能帮我解决这个问题吗?

更新: 我刚刚发现问题的原因是 tomcat,当我使用 ISO-8859-1 编码通过 POST 发送请求时,服务工作正常。解决办法是改变tomcat的编码。

最佳答案

内容类型可能是问题所在,但这取决于您在客户端上的 POST 中生成的内容类型以及接收端的 XML 解析器使用的字符集。

在许多此类情况下,一种可行的替代方案是在 XML 中可能出现特殊字符的地方使用 CDATA(未解析的字符数据) block 。

<sending>
    <sms>
        <message><![CDATA[España]]></message>
    </sms>
</sending>

默认情况下,XML 解析器将尝试解析 XML 消息中的所有文本。 CDATA block 告诉 XML 解析器不要解析 CDATA block 中包含的字符。

如果接收此消息的服务无法识别该字符,则可能会出错或假设 XML 格式不正确并抛出您所看到的 400。

有关 CDATA block 的更多信息:http://www.w3schools.com/xml/xml_cdata.asp

关于使用特殊字符的 Java Restful 服务编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12532441/

相关文章:

java - 枚举包装器中的类型安全

java - 如何在Java中从数据源名称获取sqlserver数据库名称

java - 使用 getter 而不使用 setter

java - NetBeans 中出现认证错误,即使 ".CER"文件已添加到 KeyStore

java - Spring MVC Rest中处理JSon时如何处理POJO嵌套对象

java - 检查字符串是否与 Web Driver 相等

ruby - 如何使用XPath通过匹配文本找到父节点

xml - xsltproc (osx) "not a stylesheet, compilation error"。但是 xml 和 xsl 都可以在在线工具上使用

android - 在 nativescript 中更改 AndroidManifest.xml 和 styles.xml 后,ActionBar 和标题不会消失

rest - D 中有哪些可用的非阻塞 Web 服务器?