Egor Fabricius
Egor Fabricius

Reputation: 55

Make Spring accept UTF-8 Characers in rest calls

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äseresults 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

Answers (1)

sschrass
sschrass

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

Related Questions