Java Restful服务编码与特殊字符

时间:2012-09-21 14:23:13

标签: 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,当我通过POST发送请求时使用ISO-8859-1编码服务工作正常。解决方案是更改tomcat的编码。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的客户端似乎发送了无效请求。我怀疑您使用的是非UTF8编码,并且未在Content-Type header中指定其名称。如果您发布完整的HTTP请求,我可以通过更多详细信息来诊断问题。

答案 2 :(得分:0)

对我来说很重要的是你没有指定@Consumes注释...尝试在你的方法上添加@Consumes(MediaType.APPLICATION_XML)。另外,请务必发送Content-Type并使用相应的<?xml标记指定字符编码。

答案 3 :(得分:0)

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

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

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

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

如果您接收此服务的服务无法识别该字符,则可能是错误输出或假设XML格式不正确并且丢失了您正在看到的400.

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