crnk-framework icon indicating copy to clipboard operation
crnk-framework copied to clipboard

TypeParser with CrnkMappableException and crnk-setup-spring-boot2

Open marciovmartins opened this issue 5 years ago • 3 comments

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

marciovmartins avatar Aug 01 '20 11:08 marciovmartins

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?

remmeier avatar Aug 03 '20 16:08 remmeier

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

marciovmartins avatar Aug 03 '20 17:08 marciovmartins

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.

konoplev avatar Aug 04 '20 07:08 konoplev