我如何处理请求中作为“@PathVariable”出现的“ñ”字符,Spring 启动

How do i Handle a "ñ" character that comes as a "@PathVariable" in a request, Spring Boot

我有一个具有以下方法的 RESTController:

@GetMapping(value = "/equipos/ciudad/{ciudad}", produces = {"application/json"})
public ResponseEntity<List<EquipoBean>> getEquiposByCiudad(@PathVariable(name = "ciudad") String ciudad) {
    return new ResponseEntity<>(service.getEquiposByCiudad(ciudad), HttpStatus.OK);
}

当我发送普通字符时它可以工作,即使它们之间有多个带有空格的单词,但是当我发送“ñ”字符时我得到这样的异常:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:475) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

我试着用谷歌搜索来寻找答案,但我没有得到解决方案,所以我想问一下,有没有办法让我设置我的 RESTController 以正确处理这些类型的特殊字符?

你的客户就是expected to URL-encode这样的人物。所以 ñ 变成 %C3%B1.


您似乎在使用西班牙城市名称作为参数。所以我将以 A Coruña 为例。如果你的客户端是用Java写的,你可以用URLEncoder:

String url = "http://example.org?q=" + URLEncoder.encode("A Coruña", "UTF-8");

从Java10开始,您可以使用:

String url = "http://example.org?q=" + 
    URLEncoder.encode("A Coruña", StandardCharsets.UTF_8);

这样,A Coruña 将被编码为 A+Coru%C3%B1a

问题是,如异常所述,ñ 不能出现在有效的 URL 中。 RFC 定义了一组非常具体的允许使用的字符,所有其他字符都需要进行 URL 编码。

所以解决方案应该是,无论谁打电话给您 API 都需要 url 对他们的请求进行编码,您的服务才能正常工作。