在我使用的环境(Tomcat 6)中,当映射到@PathVariable时,路径段中的百分比序列显然是使用ISO-8859-1解码的。
我希望它是UTF-8。
我已经将Tomcat配置为使用UTF-8(使用server.xml中的URIEncoding属性)。
Spring / Rest是否自己进行解码?如果是,我在哪里可以覆盖默认编码?
附加信息; 这是我的测试代码:
@RequestMapping( value = "/enc/{foo}", method = RequestMethod.GET )
public HttpEntity<String> enc( @PathVariable( "foo" ) String foo, HttpServletRequest req )
{
String resp;
resp = " path variable foo: " + foo + "\n" +
" req.getPathInfo(): " + req.getPathInfo() + "\n" +
"req.getPathTranslated(): " + req.getPathTranslated() + "\n" +
" req.getRequestURI(): " + req.getRequestURI() + "\n" +
" req.getContextPath(): " + req.getContextPath() + "\n";
HttpHeaders headers = new HttpHeaders();
headers.setContentType( new MediaType( "text", "plain", Charset.forName( "UTF-8" ) ) );
return new HttpEntity<String>( resp, headers );
}
如果我使用以下URI路径执行HTTP GET请求:
/TEST/enc/%c2%a3%20and%20%e2%82%ac%20rates
这是UTF-8编码,然后是百分比编码的形式
/TEST/enc/£ and € rates
我得到的输出是:
path variable foo: £ and ⬠rates
req.getPathInfo(): /enc/£ and € rates
req.getPathTranslated(): C:\Users\jre\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\TEST\enc\£ and € rates
req.getRequestURI(): /TEST/enc/%C2%A3%20and%20%E2%82%AC%20rates
req.getContextPath(): /TEST
对我来说,这表明Tomcat(设置了URIEncoding属性后)做了正确的事情(请参阅getPathInfo()),但是path变量仍在ISO-8859-1中被解码。
答案是:
Spring / Rest显然使用了请求编码,这很奇怪,因为它是关于body的,而不是URI。叹。
添加:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.html" target="_blank">web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
解决了问题。确实应该更简单。
实际上,情况更糟:
如果该方法确实具有请求主体,并且该请求主体未使用UTF-8编码,则需要附加的forceEncoding参数。这似乎可行,但我担心稍后会引起更多问题。
另一种方法
同时,我发现可以禁用解码
<property name="urlDecode" value="false"/>
…在这种情况下,接受者可以做正确的事;但这当然会使其他很多事情变得困难。
我需要将筛选器添加到web.xml
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我使用的是Spring4.1.9.版本 配置下一个Rest控制器。 并创建了/get/{id}以某种方式隐藏/get/matrix/{vars}的映射 当我尝试通过下一个url调用它时http://localhost:8080/testmatrixvariables/get/matrix/;v1=1;v2=2;v3=3我从调试日志中获得 org.springframework.beans.Type
我想指出pathvariable secondpart。这是不可能的,因为错误消息显示:无法确定:veranstaltung的类型。Identificationnumber,在表中:teilnehmer,用于列:[org.hibernate.mapping.Column(id)] 要使用变量secondpart,我必须更改什么?如何访问控制器方法中的变量secondpart? } }
在spring MVC中使用中,你能给我一个简单的解释和示例吗?请包括如何键入url? 我正在努力获得正确的url以显示jsp页面。多谢了。
我正在编写一个Rest服务(HTTP获取endpoint),在下面的uri中执行以下操作 获取uri中传递的客户id的详细信息 代码: 但是,在上面的代码中,对于第二个场景,控件将流向getCustomers()。 注意:我使用的是Java8和SpringWeb4.3.10版本 非常感谢任何对此的帮助。
我试图获取一个用户的所有数据,该用户有一个时间戳: 现在,为了测试这个Spring Boot rest api,我在postman中调用了GET和urlhttp://localhost:8080/datum/2/2019-12-15T19:37:15.330995。 但它给我的错误是:未能转换“java”类型的值。lang.String“to required type”java。时间LocalD
问题内容: 我正在使用Java Spring Resttemplate通过get请求获取json。我正在获取的JSON代替了诸如üöä或ß之类的特殊字符。所以我猜字符编码有问题。我在互联网上找不到任何帮助。我现在使用的代码是: 问题答案: 您只需将添加到模板的消息转换器中: