Reputation: 55
I build a small Spring-Boot application and have a problem with utf-8 encoded character. In my controller I have a method like
@DeleteMapping("deleteIngredient/{ingredientId}")
public void delteIngredient(@PathVariable final String ingredientId) {
ingredientService.delteIngredient(ingredientId);
}
But calling localhost:8080/deleteIngredient/käse
results in
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]
Any Ideas?
Upvotes: 1
Views: 642
Reputation: 7166
Spring is complaining about german Umlauts here, "ä" is not allowed.
The valid characters are defined in RFC 7230 and RFC 3986
The same reason you cannot have a domain like "dasörtliche.de".
You probably could force spring to accept Umlauts, but you would violate the RFC. My advice is to encode the links your api produces to be conform with the RFC (probably already springs default). A client then would need to encode käse
to k%C3%A4se
itself (if it is constructing a link itself and not using your links that are conform to RFCs), but any client should be accustomed to that already.
Upvotes: 3