首页 > 解决方案 > 让 Spring 在休息调用中接受 UTF-8 字符

问题描述

我构建了一个小型 Spring-Boot 应用程序,但遇到了 utf-8 编码字符的问题。在我的控制器中,我有一个类似的方法

@DeleteMapping("deleteIngredient/{ingredientId}")
public void delteIngredient(@PathVariable final String ingredientId) {
    ingredientService.delteIngredient(ingredientId);
}

但是调用localhost:8080/deleteIngredient/käse会导致

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.22.jar:9.0.22]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:294) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.22.jar:9.0.22]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_221]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_221]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.22.jar:9.0.22]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_221]

有任何想法吗?

标签: javarestspring-bootencoding

解决方案


春天在这里抱怨德国变音符号,“ä”是不允许的。

有效字符在 RFC 7230 和 RFC 3986 中定义

同样的原因,您不能拥有像“ dasörtliche.de ”这样的域。

您可能可以强制 spring 接受 Umlauts,但您会违反 RFC。我的建议是将您的 api 生成的链接编码为符合 RFC(可能已经默认)。然后客户端需要对自己进行编码käsek%C3%A4se如果它自己构建链接而不使用符合 RFC 的链接),但任何客户端都应该已经习惯了。


推荐阅读