crnk-framework
crnk-framework copied to clipboard
TypeParser with CrnkMappableException and crnk-setup-spring-boot2
How can I map an CrnkMappableException as ResourceNotFoundException for example, as an 404 exception instead of 500?
I had this problem when upgrade from crnk-setup-spring-boot1 to crnk-setup-spring-boot2.
@Configuration
public class CrnkConfig {
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
public CrnkConfig(CrnkBoot crnkBoot) {
crnkBoot.getModuleRegistry().getTypeParser().addParser(UUID.class, uuidStringParser());
}
private static StringParser<UUID> uuidStringParser() {
return input -> {
try {
return UUID.fromString(input);
} catch (IllegalArgumentException e) {
throw new ResourceNotFoundException(e.getMessage());
}
};
}
}
I wrote an example here: https://github.com/marciovmartins/crnk-type-parser
what is the original exception? it would make sense to adjust crnk-core to give a 4xx error. Maybe a BadRequestException would be most suitable in case of an ID parsing exception?
IllegalArgumentAccess. I chose to use 404 because doesn't matter to me if the id is wrong or non existent. What the automatized systems could do by themselves to recovery from this situation? IMO this needs only bubble up.
Would be nice to make it customizable in case it's not specified by the json api documentation to be 400 bad request.
2020-08-03 19:05:57.956 INFO 4215 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-08-03 19:05:57.956 INFO 4215 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-08-03 19:05:57.961 INFO 4215 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms
2020-08-03 19:06:21.783 ERROR 4215 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
io.crnk.core.engine.parser.ParserException: not a valid uuid
at io.crnk.core.engine.parser.DefaultStringParsers$11.parse(DefaultStringParsers.java:101) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.parser.DefaultStringParsers$11.parse(DefaultStringParsers.java:95) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.parser.TypeParser.parse(TypeParser.java:136) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.information.resource.ResourceInformation$1.parse(ResourceInformation.java:113) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.information.resource.ResourceInformation.parseIdString(ResourceInformation.java:574) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.internal.dispatcher.path.PathBuilder.parseIds(PathBuilder.java:51) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.internal.dispatcher.path.PathBuilder.parseIdPath(PathBuilder.java:123) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.internal.dispatcher.path.PathBuilder.parseResourcePath(PathBuilder.java:118) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.internal.dispatcher.path.PathBuilder.build(PathBuilder.java:101) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.internal.http.JsonApiRequestProcessorHelper.getJsonPath(JsonApiRequestProcessorHelper.java:36) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.internal.http.JsonApiRequestProcessor.accepts(JsonApiRequestProcessor.java:88) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.core.engine.internal.http.HttpRequestDispatcherImpl.process(HttpRequestDispatcherImpl.java:71) ~[crnk-core-3.2.20200419165537.jar:na]
at io.crnk.servlet.CrnkFilter.doFilter(CrnkFilter.java:85) ~[crnk-setup-servlet-3.2.20200419165537.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
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.29.jar:9.0.29]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.IllegalArgumentException: Invalid UUID string: abc123
at java.base/java.util.UUID.fromString(UUID.java:215) ~[na:na]
at io.crnk.core.engine.parser.DefaultStringParsers$11.parse(DefaultStringParsers.java:99) ~[crnk-core-3.2.20200419165537.jar:na]
... 42 common frames omitted
I described here why this exception can't be mapped currently. I have the same problem. It would be great to implement a possibility to map ParserException.