当前位置: 首页 > 知识库问答 >
问题:

CXF RS和JAX-WS编码的内容不可读

宋丰
2023-03-14

我的问题有两个方面,与编码有关。我在JBoss 7.1.1上部署了一个REST web应用程序。它有一个外部web服务的适配器,我已经用CXF java2wsdl从提供的WSDL为其创建了存根。在此外部web服务请求的请求/响应期间

问题是,我的REST服务或SOAP适配器无法正确发送/使用这些编码内容,而这些内容来自SOAPUI。下面是一个例子

REST调用将参数“挈挈挈挈挈挈挈挈”传递为

@PathParam(“receiverName”)字符串receiverName

标头包含字符集=UTF-8

服务器日志使用cxf日志拦截器记录以下内容

--------------------------------------
 Inbound Message
----------------------------
ID: 32
Address:     http://127.0.0.1:8080/rest/request/card/10122083/%D0%A2%D0%B5%D1%81%D1%82%20%D0%A2%D0%B5%D1%81%D1%82/1234124143312
Encoding: UTF-8
Http-Method: POST
Content-Type: application/json; charset=UTF-8
    Headers: {Accept=[application/json], accept-encoding=[gzip, deflate], accept-language=    [en-gb,en;q=0.5], cache-control=[no-cache], connection=[keep-alive], Content-Length=[313],     content-type=[application/json; charset=UTF-8], host=[127.0.0.1:8080], pragma=[no-cache],     user-agent=[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1]}
----------------------------

我的代码现在打印在日志中的参数值为“?”

在后端,当我再次收到保加利亚文内容时,我遇到了这个问题,下面是这样一个响应的示例

Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], 

根据日志和wireshark,发送请求时带有上述标题,响应为:

-----------------------------------------------------------------
ID: 2
Response-Code: 200
Encoding: ISO-8859-1
Content-Type: text/xml
Headers: {Content-Length=[1011], content-type=[text/xml], Server=[IRS/1.0.18.0 guz]}
Payload: <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:loy="http://www.location.bg/Loyalty/">
<soapenv:Header/>
<soapenv:Body>
<loy:CustLoyaltyResponse>
                <OutputRequestID>SCR0000000394</OutputRequestID>
                <OutputTimeStamp>20120918095649992</OutputTimeStamp>
                <StatusCode>0</StatusCode>
                <StatusMessage>Loyal Customer</StatusMessage>
                <CustomerCode>10122083</CustomerCode>
                <CustomerLoyalStatus>1</CustomerLoyalStatus>
                <LoyalLevel>Special</LoyalLevel>
                <CardObject>
                                <CardStatus>0</CardStatus>
                                <CardCustCode>10122083</CardCustCode>
                                <CardNo>100012624110122083</CardNo>
                                <CardState>4</CardState>
                                <Level>Special</Level>
                                <City>Р?Р°С?РЅР°</City>
                                <Postcode>9000</Postcode>
                                <Address>жк. Чайка</Address>
                                <NameOfRecipient>РўРµС?С? РўРµС?С?</NameOfRecipient>
                                <NumberOfRecipient>12345678</NumberOfRecipient>
                                <LastStatusChangeDate></LastStatusChangeDate>
                </CardObject>
</loy:CustLoyaltyResponse>
</soapenv:Body>
</soapenv:Envelope>
-----------------------------------------------------------------

这个问题可以从

                                <City>Р?Р°С?РЅР°</City>
                            <Address>жк. Чайка</Address>

而在SOAPUI中,结果是正确的

<City>Варна</City>
<Address>жк. Чайка</Address>

有什么想法问题是什么以及如何解决它吗?

共有2个答案

常子濯
2023-03-14

最后,我查看了我的日志文件类型,它不是UTF-8,因此我在log4j中添加了以下内容,使其成为UTF-8

<param name="Encoding" type="UTF-8" /> 

正如@unhillbilly建议的那样。此外,我的编辑器(TextPad)没有显示UTF-8,所以我换成了记事本,并删除了@Encoded注释,得到了“挈挈挈挈挈挈挈挈挈”

现在,该值已从JAX-RS中正确检索并传递到我的JAX-WS客户机适配器(日志显示的所有方式),它也在SOAP请求中正确发送(LoginInterceptors在SOAP请求的打印输出中显示了这一点,而外部web服务现在的回复似乎证实了这一点)。

Request
Address: http://192.168.3.251:4445/WSDL
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], 
...
<ReceiverName>Тест Тест</ReceiverName>

仍然存在的问题是,当我收到一个包含保加利亚字符的响应时,日志和REST客户端都没有得到正确的字符编码,但是SOAP UI中的相同请求会导致正确的字符显示

这个问题可以在我的日志中看到,我的Rest客户端如下

<City>Р?Р°С?РЅР°</City>  
<Address>жк. Чайка</Address>  

而在SOAPUI中结果是正确的

<City>Варна</City>  
<Address>жк. Чайка</Address>  

我收到的回复的标题如下所示。我原以为ISO-8859-1可能会影响我,但它并没有解释为什么SOAP UI能正确处理它。在我看来,我无法影响web服务本身从我的管道返回的编码。

ID: 2 
Response-Code: 200 
Encoding: ISO-8859-1 
Content-Type: text/xml 
Headers: {Content-Length=[1011], content-type=[text/xml], 
Server=[IRS/1.0.18.0 guz]}
Payload: <?xml version="1.0" encoding="UTF-8"?>
吕自怡
2023-03-14

可能是日志记录设施没有将输出记录为UTF-8?如果使用的是log4j,请尝试添加

<param name="Encoding" value="UTF-8"/>

它的配置

 类似资料:
  • 问题内容: 如何编写JAX-WS服务,以便我的@WebMethod的@WebParam是类似于DateTime的Joda- Time类?参数上的@XmlTypeAdapter是否可以工作?我正在部署到GlassFish 2.1。 让我澄清这个问题,因为到目前为止,这两个答案都集中在将自定义类型绑定到现有的JAXB类上,这与之相关,但与我要问的问题无关。如何使以下@WebService接受joda

  • JAX-WS (JavaTM API for XML-Based Web Services)规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。 在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要

  • 我试图使用服务/调度机制发布一个JAX-RS资源。问题是传出请求的内容类型被锁定为。我看不出有什么方法可以将其更改为其他类型,例如。 RESTful webservice只使用和。这是我使用的代码: 接受标头被修改为zoo标头,foo标头添加了值,但Content-Type保持不变。我想我可以使用一个过滤器,并根据一些条件修改,甚至基于foo头,但这似乎违反直觉。 以下是请求的所有标题: 感谢您的

  • 问题内容: 我有一个简单的命令行Java JAX-WS应用程序来测试SOAP请求,但是服务器期望密码类型为PasswordText,而我对如何设置此密码感到困惑… 代码如下所示: 我已经使用SOAP-UI测试了请求,所以我知道它正在工作。任何帮助设置密码类型将不胜感激。 谢谢。 问题答案: 这将设置基本HTTP身份验证的用户名和密码。如果您已经在SoapUI中对其进行了测试,那么我猜您在请求详细信

  • 问题内容: 我有一个已导入xsd的wsdl,此xsd具有类似如下的限制: 因此,我想细想一下,当我通过netbeans将这个耳朵部署到glassfish上时,将对传入的数据进行验证,但事实并非如此。在将数据传递给我的@WebService对象并转换为Java对象之前,是否需要进行任何调用以确保数据经过验证。 问题答案: 使用SchemaValidation批注。 请注意,它仅适用于文档/文字样式的

  • Apache CXF WebService 没有话说,享受沉默 showcase项目已演示了JAX-WS2.0 + CXF 的最重要特性, 其中客户端在测试用例里. SOAP这个名字,本身就是个笑话,一点都不Simple。其他一些WS-*协议,包括安全,附件等都不再看好,因此SpringSide4.0没什么更新。 测试工具依然是SoapUI。 Tips 1. CXF自动生成的WSDL与WADL文件