zalando / problem-spring-web

A library for handling Problems in Spring Web MVC
MIT License
1.03k stars 125 forks source link

Unable to download file(Resource). Spring boot 2.1.3.RELEASE MVC application. #363

Closed atularimon closed 4 years ago

atularimon commented 5 years ago

After configuring ProblemModule with ObjectMapper, All the API's which was returnign files/images as downloadable Resource started giving 406.

Description

Initially I was getting stacktraces as on output whenever any exception occured. For disabling that I added below code inside my spring application. @Configuration public class WebConfigurer implements WebMvcConfigurer {

private final Logger log = LoggerFactory.getLogger(WebConfigurer.class);

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.debug("Configuring custom HttpMessageConverters.");

    ObjectMapper mapper = Jackson2ObjectMapperBuilder.json()
            .modules(new ConstraintViolationProblemModule(),new ProblemModule()).build();
    converters.add(new MappingJackson2HttpMessageConverter(mapper));
}

}

After adding this it disables stacktraces from the response.

Expected Behavior

APIs should not break.

Actual Behavior

APIs are returning 406. Detailed output below

"details": { "type": "http://www.arimon.tech/problem/problem-with-message", "title": "Not Acceptable", "status": 406, "detail": "Could not find acceptable representation", "path": "/oculyse/api/v1/public/download", "message": "error.http.406" } Note:I've customised the default output keys as per my requiremnt.

Possible Fix

Eagerly looking for.

Steps to Reproduce

1.Add the below configuration (same as mentioned earlier) @Configuration public class WebConfigurer implements WebMvcConfigurer {

private final Logger log = LoggerFactory.getLogger(WebConfigurer.class);

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.debug("Configuring custom HttpMessageConverters.");

    ObjectMapper mapper = Jackson2ObjectMapperBuilder.json()
            .modules(new ConstraintViolationProblemModule(),new ProblemModule()).build();
    converters.add(new MappingJackson2HttpMessageConverter(mapper));
}

}

  1. Now for example, this dummy API will start giving 406

@GetMapping(path = "/public/download") public ResponseEntity testDownload(HttpServletRequest request) throws Exception{ Resource resource = new UrlResource("https://www.javaspecialists.eu/pics/teachable/superpack-thumbnail-ios.png"); / Try to determine file's content type / String contentType = null; try { contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath()); } catch (IOException ex) { log.info("Could not determine file type for error file id {}."); }

    // Fallback to the default content type if type could not be determined
    if (contentType == null) {
        contentType = "application/octet-stream";
    }

    return ResponseEntity.ok()
            .contentType(MediaType.parseMediaType(contentType))
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
            .body(resource);

}

Without the customization of HttpMessageConverters it works fine.

Your Environment

Zalando version:

org.zalando problem-spring-web 0.25.0

I'm using this with spring boot Spring boot 2.1.3.RELEASE MVC application.

If you need further details, please let me know.

an0nh4x0r commented 5 years ago

I'm also facing the same issue.

dinkararora commented 5 years ago

I am also not able to find any solution to this problem. Either i can disable stack trace or escape the 406 error code.

ruchiyadav commented 5 years ago

I'm also stuck because of this issue. unable to download a resource file

whiskeysierra commented 4 years ago

Configure the HttpMessageConverters to use for reading or writing to the body of the request or response. If no converters are added, a default list of converters is registered.

Note that adding converters to the list, turns off default converter registration. To simply add a converter without impacting default registration, consider using the method extendMessageConverters(java.util.List) instead.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html#configureMessageConverters-java.util.List-

That's most likely the issue here.

ArimonConsulting commented 4 years ago

@whiskeysierra Thanks for your reply. I tried configuring it, as suggested by you. @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { log.debug("Configuring custom HttpMessageConverters."); ObjectMapper mapper = Jackson2ObjectMapperBuilder.json() .modules(new ProblemModule(), new ConstraintViolationProblemModule()).build(); converters.add(new MappingJackson2HttpMessageConverter(mapper)); }

But still, I'm unable to disable the stack trace. The resource is being downloaded fine. But still I can't disable the stacktrace in case of any exception. Any suggestions?

Best.

atularimon commented 4 years ago

Configure the HttpMessageConverters to use for reading or writing to the body of the request or response. If no converters are added, a default list of converters is registered. Note that adding converters to the list, turns off default converter registration. To simply add a converter without impacting default registration, consider using the method extendMessageConverters(java.util.List) instead. https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html#configureMessageConverters-java.util.List-

That's most likely the issue here.

Still unable to disable the stacktrace, even if i'm using extendMessageConverters(java.util.List) instead.

@override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { log.debug("Configuring custom HttpMessageConverters."); ObjectMapper mapper = Jackson2ObjectMapperBuilder.json() .modules(new ProblemModule(), new ConstraintViolationProblemModule()).build(); converters.add(new MappingJackson2HttpMessageConverter(mapper)); }

Best.

whiskeysierra commented 4 years ago

Can you show a sample response in case of exceptions?

atularimon commented 4 years ago

Sure @whiskeysierra No i'm getting the stack traces which i should not.

{ "meta": { "code": 404, "message": "No handler found for GET /test-app/api/v1/public/download2", "details": { "cause": null, "stackTrace": [ { "methodName": "build", "fileName": "ProblemBuilder.java", "lineNumber": 83, "className": "org.zalando.problem.ProblemBuilder", "nativeMethod": false }, { "methodName": "process", "fileName": "GlobalExceptionHandler.java", "lineNumber": 59, "className": "com.ari.ai.test-app.api.error.GlobalExceptionHandler", "nativeMethod": false }, { "methodName": "create", "fileName": "AdviceTrait.java", "lineNumber": 202, "className": "org.zalando.problem.spring.web.advice.AdviceTrait", "nativeMethod": false }, { "methodName": "create", "fileName": "AdviceTrait.java", "lineNumber": 104, "className": "org.zalando.problem.spring.web.advice.AdviceTrait", "nativeMethod": false }, { "methodName": "create", "fileName": "AdviceTrait.java", "lineNumber": 99, "className": "org.zalando.problem.spring.web.advice.AdviceTrait", "nativeMethod": false }, { "methodName": "handleNoHandlerFound", "fileName": "NoHandlerFoundAdviceTrait.java", "lineNumber": 36, "className": "org.zalando.problem.spring.web.advice.routing.NoHandlerFoundAdviceTrait", "nativeMethod": false }, { "methodName": "invoke0", "fileName": "NativeMethodAccessorImpl.java", "lineNumber": -2, "className": "sun.reflect.NativeMethodAccessorImpl", "nativeMethod": true }, { "methodName": "invoke", "fileName": "NativeMethodAccessorImpl.java", "lineNumber": 62, "className": "sun.reflect.NativeMethodAccessorImpl", "nativeMethod": false }, { "methodName": "invoke", "fileName": "DelegatingMethodAccessorImpl.java", "lineNumber": 43, "className": "sun.reflect.DelegatingMethodAccessorImpl", "nativeMethod": false }, { "methodName": "invoke", "fileName": "Method.java", "lineNumber": 498, "className": "java.lang.reflect.Method", "nativeMethod": false }, { "methodName": "doInvoke", "fileName": "InvocableHandlerMethod.java", "lineNumber": 189, "className": "org.springframework.web.method.support.InvocableHandlerMethod", "nativeMethod": false }, { "methodName": "invokeForRequest", "fileName": "InvocableHandlerMethod.java", "lineNumber": 138, "className": "org.springframework.web.method.support.InvocableHandlerMethod", "nativeMethod": false }, { "methodName": "invokeAndHandle", "fileName": "ServletInvocableHandlerMethod.java", "lineNumber": 102, "className": "org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod", "nativeMethod": false }, { "methodName": "doResolveHandlerMethodException", "fileName": "ExceptionHandlerExceptionResolver.java", "lineNumber": 412, "className": "org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver", "nativeMethod": false }, { "methodName": "doResolveException", "fileName": "AbstractHandlerMethodExceptionResolver.java", "lineNumber": 61, "className": "org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver", "nativeMethod": false }, { "methodName": "resolveException", "fileName": "AbstractHandlerExceptionResolver.java", "lineNumber": 139, "className": "org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver", "nativeMethod": false }, { "methodName": "resolveException", "fileName": "HandlerExceptionResolverComposite.java", "lineNumber": 80, "className": "org.springframework.web.servlet.handler.HandlerExceptionResolverComposite", "nativeMethod": false }, { "methodName": "processHandlerException", "fileName": "DispatcherServlet.java", "lineNumber": 1297, "className": "org.springframework.web.servlet.DispatcherServlet", "nativeMethod": false }, { "methodName": "processDispatchResult", "fileName": "DispatcherServlet.java", "lineNumber": 1109, "className": "org.springframework.web.servlet.DispatcherServlet", "nativeMethod": false }, { "methodName": "doDispatch", "fileName": "DispatcherServlet.java", "lineNumber": 1055, "className": "org.springframework.web.servlet.DispatcherServlet", "nativeMethod": false }, { "methodName": "doService", "fileName": "DispatcherServlet.java", "lineNumber": 942, "className": "org.springframework.web.servlet.DispatcherServlet", "nativeMethod": false }, { "methodName": "processRequest", "fileName": "FrameworkServlet.java", "lineNumber": 1005, "className": "org.springframework.web.servlet.FrameworkServlet", "nativeMethod": false }, { "methodName": "doGet", "fileName": "FrameworkServlet.java", "lineNumber": 897, "className": "org.springframework.web.servlet.FrameworkServlet", "nativeMethod": false }, { "methodName": "service", "fileName": "HttpServlet.java", "lineNumber": 634, "className": "javax.servlet.http.HttpServlet", "nativeMethod": false }, { "methodName": "service", "fileName": "FrameworkServlet.java", "lineNumber": 882, "className": "org.springframework.web.servlet.FrameworkServlet", "nativeMethod": false }, { "methodName": "service", "fileName": "HttpServlet.java", "lineNumber": 741, "className": "javax.servlet.http.HttpServlet", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 231, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "WsFilter.java", "lineNumber": 53, "className": "org.apache.tomcat.websocket.server.WsFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "CorsFilter.java", "lineNumber": 96, "className": "org.springframework.web.filter.CorsFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "HttpTraceFilter.java", "lineNumber": 90, "className": "org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 320, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "invoke", "fileName": "FilterSecurityInterceptor.java", "lineNumber": 127, "className": "org.springframework.security.web.access.intercept.FilterSecurityInterceptor", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterSecurityInterceptor.java", "lineNumber": 91, "className": "org.springframework.security.web.access.intercept.FilterSecurityInterceptor", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ExceptionTranslationFilter.java", "lineNumber": 119, "className": "org.springframework.security.web.access.ExceptionTranslationFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "SessionManagementFilter.java", "lineNumber": 137, "className": "org.springframework.security.web.session.SessionManagementFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "AnonymousAuthenticationFilter.java", "lineNumber": 111, "className": "org.springframework.security.web.authentication.AnonymousAuthenticationFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "SecurityContextHolderAwareRequestFilter.java", "lineNumber": 170, "className": "org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "RequestCacheAwareFilter.java", "lineNumber": 63, "className": "org.springframework.security.web.savedrequest.RequestCacheAwareFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "JWTFilter.java", "lineNumber": 42, "className": "com.ari.ai.test-app.security.jwt.JWTFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "LogoutFilter.java", "lineNumber": 116, "className": "org.springframework.security.web.authentication.logout.LogoutFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "HeaderWriterFilter.java", "lineNumber": 74, "className": "org.springframework.security.web.header.HeaderWriterFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "SecurityContextPersistenceFilter.java", "lineNumber": 105, "className": "org.springframework.security.web.context.SecurityContextPersistenceFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "WebAsyncManagerIntegrationFilter.java", "lineNumber": 56, "className": "org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "FilterChainProxy.java", "lineNumber": 215, "className": "org.springframework.security.web.FilterChainProxy", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 178, "className": "org.springframework.security.web.FilterChainProxy", "nativeMethod": false }, { "methodName": "invokeDelegate", "fileName": "DelegatingFilterProxy.java", "lineNumber": 357, "className": "org.springframework.web.filter.DelegatingFilterProxy", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "DelegatingFilterProxy.java", "lineNumber": 270, "className": "org.springframework.web.filter.DelegatingFilterProxy", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ExceptionLoggingFilter.java", "lineNumber": 50, "className": "org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "TracingFilter.java", "lineNumber": 86, "className": "brave.servlet.TracingFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "filterAndRecordMetrics", "fileName": "WebMvcMetricsFilter.java", "lineNumber": 117, "className": "org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "WebMvcMetricsFilter.java", "lineNumber": 106, "className": "org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "CharacterEncodingFilter.java", "lineNumber": 200, "className": "org.springframework.web.filter.CharacterEncodingFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "invoke", "fileName": "StandardWrapperValve.java", "lineNumber": 200, "className": "org.apache.catalina.core.StandardWrapperValve", "nativeMethod": false }, { "methodName": "invoke", "fileName": "StandardContextValve.java", "lineNumber": 96, "className": "org.apache.catalina.core.StandardContextValve", "nativeMethod": false }, { "methodName": "invoke", "fileName": "AuthenticatorBase.java", "lineNumber": 490, "className": "org.apache.catalina.authenticator.AuthenticatorBase", "nativeMethod": false }, { "methodName": "invoke", "fileName": "StandardHostValve.java", "lineNumber": 139, "className": "org.apache.catalina.core.StandardHostValve", "nativeMethod": false }, { "methodName": "invoke", "fileName": "ErrorReportValve.java", "lineNumber": 92, "className": "org.apache.catalina.valves.ErrorReportValve", "nativeMethod": false }, { "methodName": "invoke", "fileName": "StandardEngineValve.java", "lineNumber": 74, "className": "org.apache.catalina.core.StandardEngineValve", "nativeMethod": false }, { "methodName": "service", "fileName": "CoyoteAdapter.java", "lineNumber": 343, "className": "org.apache.catalina.connector.CoyoteAdapter", "nativeMethod": false }, { "methodName": "service", "fileName": "Http11Processor.java", "lineNumber": 408, "className": "org.apache.coyote.http11.Http11Processor", "nativeMethod": false }, { "methodName": "process", "fileName": "AbstractProcessorLight.java", "lineNumber": 66, "className": "org.apache.coyote.AbstractProcessorLight", "nativeMethod": false }, { "methodName": "process", "fileName": "AbstractProtocol.java", "lineNumber": 834, "className": "org.apache.coyote.AbstractProtocol$ConnectionHandler", "nativeMethod": false }, { "methodName": "doRun", "fileName": "NioEndpoint.java", "lineNumber": 1415, "className": "org.apache.tomcat.util.net.NioEndpoint$SocketProcessor", "nativeMethod": false }, { "methodName": "run", "fileName": "SocketProcessorBase.java", "lineNumber": 49, "className": "org.apache.tomcat.util.net.SocketProcessorBase", "nativeMethod": false }, { "methodName": "runWorker", "fileName": "ThreadPoolExecutor.java", "lineNumber": 1149, "className": "java.util.concurrent.ThreadPoolExecutor", "nativeMethod": false }, { "methodName": "run", "fileName": "ThreadPoolExecutor.java", "lineNumber": 624, "className": "java.util.concurrent.ThreadPoolExecutor$Worker", "nativeMethod": false }, { "methodName": "run", "fileName": "TaskThread.java", "lineNumber": 61, "className": "org.apache.tomcat.util.threads.TaskThread$WrappingRunnable", "nativeMethod": false }, { "methodName": "run", "fileName": "Thread.java", "lineNumber": 748, "className": "java.lang.Thread", "nativeMethod": false } ], "type": "http://www.test-api.tech/problem/problem-with-message", "title": "Not Found", "status": "NOT_FOUND", "detail": "No handler found for GET /test-app/api/v1/public/download2", "instance": null, "parameters": { "path": "/test-app/api/v1/public/download2", "message": "error.http.404" }, "message": "Not Found: No handler found for GET /test-app/api/v1/public/download2", "localizedMessage": "Not Found: No handler found for GET /test-app/api/v1/public/download2", "suppressed": [] } } }

I've customized the default response structure , so please ignore the structure.

Best.

whiskeysierra commented 4 years ago

That's not the output of the problem module, but rather the default serialization pattern. The problem module is not being used here. I guess there are two jackson message converters registered and it's the default that's picked up.

I'd suggest to register modules like this:

https://github.com/zalando/problem-spring-web/tree/master/problem-spring-web#configuration

ArimonConsulting commented 4 years ago

Think I am cced in error ?

From: atularimon notifications@github.com Reply to: zalando/problem-spring-web reply@reply.github.com Date: Thursday, 10 October 2019 at 07:45 To: zalando/problem-spring-web problem-spring-web@noreply.github.com Cc: Arindom Basu Arindom.Basu@digilytics.ai, Comment comment@noreply.github.com Subject: Re: [zalando/problem-spring-web] Unable to download file(Resource). Spring boot 2.1.3.RELEASE MVC application. (#363)

Sure @whiskeysierrahttps://github.com/whiskeysierra No i'm getting the stack traces which i should not.

{ "meta": { "code": 404, "message": "No handler found for GET /test-app/api/v1/public/download2", "details": { "cause": null, "stackTrace": [ { "methodName": "build", "fileName": "ProblemBuilder.java", "lineNumber": 83, "className": "org.zalando.problem.ProblemBuilder", "nativeMethod": false }, { "methodName": "process", "fileName": "GlobalExceptionHandler.java", "lineNumber": 59, "className": "com.ari.ai.test-app.api.error.GlobalExceptionHandler", "nativeMethod": false }, { "methodName": "create", "fileName": "AdviceTrait.java", "lineNumber": 202, "className": "org.zalando.problem.spring.web.advice.AdviceTrait", "nativeMethod": false }, { "methodName": "create", "fileName": "AdviceTrait.java", "lineNumber": 104, "className": "org.zalando.problem.spring.web.advice.AdviceTrait", "nativeMethod": false }, { "methodName": "create", "fileName": "AdviceTrait.java", "lineNumber": 99, "className": "org.zalando.problem.spring.web.advice.AdviceTrait", "nativeMethod": false }, { "methodName": "handleNoHandlerFound", "fileName": "NoHandlerFoundAdviceTrait.java", "lineNumber": 36, "className": "org.zalando.problem.spring.web.advice.routing.NoHandlerFoundAdviceTrait", "nativeMethod": false }, { "methodName": "invoke0", "fileName": "NativeMethodAccessorImpl.java", "lineNumber": -2, "className": "sun.reflect.NativeMethodAccessorImpl", "nativeMethod": true }, { "methodName": "invoke", "fileName": "NativeMethodAccessorImpl.java", "lineNumber": 62, "className": "sun.reflect.NativeMethodAccessorImpl", "nativeMethod": false }, { "methodName": "invoke", "fileName": "DelegatingMethodAccessorImpl.java", "lineNumber": 43, "className": "sun.reflect.DelegatingMethodAccessorImpl", "nativeMethod": false }, { "methodName": "invoke", "fileName": "Method.java", "lineNumber": 498, "className": "java.lang.reflect.Method", "nativeMethod": false }, { "methodName": "doInvoke", "fileName": "InvocableHandlerMethod.java", "lineNumber": 189, "className": "org.springframework.web.method.support.InvocableHandlerMethod", "nativeMethod": false }, { "methodName": "invokeForRequest", "fileName": "InvocableHandlerMethod.java", "lineNumber": 138, "className": "org.springframework.web.method.support.InvocableHandlerMethod", "nativeMethod": false }, { "methodName": "invokeAndHandle", "fileName": "ServletInvocableHandlerMethod.java", "lineNumber": 102, "className": "org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod", "nativeMethod": false }, { "methodName": "doResolveHandlerMethodException", "fileName": "ExceptionHandlerExceptionResolver.java", "lineNumber": 412, "className": "org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver", "nativeMethod": false }, { "methodName": "doResolveException", "fileName": "AbstractHandlerMethodExceptionResolver.java", "lineNumber": 61, "className": "org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver", "nativeMethod": false }, { "methodName": "resolveException", "fileName": "AbstractHandlerExceptionResolver.java", "lineNumber": 139, "className": "org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver", "nativeMethod": false }, { "methodName": "resolveException", "fileName": "HandlerExceptionResolverComposite.java", "lineNumber": 80, "className": "org.springframework.web.servlet.handler.HandlerExceptionResolverComposite", "nativeMethod": false }, { "methodName": "processHandlerException", "fileName": "DispatcherServlet.java", "lineNumber": 1297, "className": "org.springframework.web.servlet.DispatcherServlet", "nativeMethod": false }, { "methodName": "processDispatchResult", "fileName": "DispatcherServlet.java", "lineNumber": 1109, "className": "org.springframework.web.servlet.DispatcherServlet", "nativeMethod": false }, { "methodName": "doDispatch", "fileName": "DispatcherServlet.java", "lineNumber": 1055, "className": "org.springframework.web.servlet.DispatcherServlet", "nativeMethod": false }, { "methodName": "doService", "fileName": "DispatcherServlet.java", "lineNumber": 942, "className": "org.springframework.web.servlet.DispatcherServlet", "nativeMethod": false }, { "methodName": "processRequest", "fileName": "FrameworkServlet.java", "lineNumber": 1005, "className": "org.springframework.web.servlet.FrameworkServlet", "nativeMethod": false }, { "methodName": "doGet", "fileName": "FrameworkServlet.java", "lineNumber": 897, "className": "org.springframework.web.servlet.FrameworkServlet", "nativeMethod": false }, { "methodName": "service", "fileName": "HttpServlet.java", "lineNumber": 634, "className": "javax.servlet.http.HttpServlet", "nativeMethod": false }, { "methodName": "service", "fileName": "FrameworkServlet.java", "lineNumber": 882, "className": "org.springframework.web.servlet.FrameworkServlet", "nativeMethod": false }, { "methodName": "service", "fileName": "HttpServlet.java", "lineNumber": 741, "className": "javax.servlet.http.HttpServlet", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 231, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "WsFilter.java", "lineNumber": 53, "className": "org.apache.tomcat.websocket.server.WsFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "CorsFilter.java", "lineNumber": 96, "className": "org.springframework.web.filter.CorsFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "HttpTraceFilter.java", "lineNumber": 90, "className": "org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 320, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "invoke", "fileName": "FilterSecurityInterceptor.java", "lineNumber": 127, "className": "org.springframework.security.web.access.intercept.FilterSecurityInterceptor", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterSecurityInterceptor.java", "lineNumber": 91, "className": "org.springframework.security.web.access.intercept.FilterSecurityInterceptor", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ExceptionTranslationFilter.java", "lineNumber": 119, "className": "org.springframework.security.web.access.ExceptionTranslationFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "SessionManagementFilter.java", "lineNumber": 137, "className": "org.springframework.security.web.session.SessionManagementFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "AnonymousAuthenticationFilter.java", "lineNumber": 111, "className": "org.springframework.security.web.authentication.AnonymousAuthenticationFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "SecurityContextHolderAwareRequestFilter.java", "lineNumber": 170, "className": "org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "RequestCacheAwareFilter.java", "lineNumber": 63, "className": "org.springframework.security.web.savedrequest.RequestCacheAwareFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "JWTFilter.java", "lineNumber": 42, "className": "com.ari.ai.test-app.security.jwt.JWTFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "LogoutFilter.java", "lineNumber": 116, "className": "org.springframework.security.web.authentication.logout.LogoutFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "HeaderWriterFilter.java", "lineNumber": 74, "className": "org.springframework.security.web.header.HeaderWriterFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "SecurityContextPersistenceFilter.java", "lineNumber": 105, "className": "org.springframework.security.web.context.SecurityContextPersistenceFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "WebAsyncManagerIntegrationFilter.java", "lineNumber": 56, "className": "org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 334, "className": "org.springframework.security.web.FilterChainProxy$VirtualFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "FilterChainProxy.java", "lineNumber": 215, "className": "org.springframework.security.web.FilterChainProxy", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "FilterChainProxy.java", "lineNumber": 178, "className": "org.springframework.security.web.FilterChainProxy", "nativeMethod": false }, { "methodName": "invokeDelegate", "fileName": "DelegatingFilterProxy.java", "lineNumber": 357, "className": "org.springframework.web.filter.DelegatingFilterProxy", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "DelegatingFilterProxy.java", "lineNumber": 270, "className": "org.springframework.web.filter.DelegatingFilterProxy", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ExceptionLoggingFilter.java", "lineNumber": 50, "className": "org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "TracingFilter.java", "lineNumber": 86, "className": "brave.servlet.TracingFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "filterAndRecordMetrics", "fileName": "WebMvcMetricsFilter.java", "lineNumber": 117, "className": "org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "WebMvcMetricsFilter.java", "lineNumber": 106, "className": "org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilterInternal", "fileName": "CharacterEncodingFilter.java", "lineNumber": 200, "className": "org.springframework.web.filter.CharacterEncodingFilter", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "OncePerRequestFilter.java", "lineNumber": 107, "className": "org.springframework.web.filter.OncePerRequestFilter", "nativeMethod": false }, { "methodName": "internalDoFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 193, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "doFilter", "fileName": "ApplicationFilterChain.java", "lineNumber": 166, "className": "org.apache.catalina.core.ApplicationFilterChain", "nativeMethod": false }, { "methodName": "invoke", "fileName": "StandardWrapperValve.java", "lineNumber": 200, "className": "org.apache.catalina.core.StandardWrapperValve", "nativeMethod": false }, { "methodName": "invoke", "fileName": "StandardContextValve.java", "lineNumber": 96, "className": "org.apache.catalina.core.StandardContextValve", "nativeMethod": false }, { "methodName": "invoke", "fileName": "AuthenticatorBase.java", "lineNumber": 490, "className": "org.apache.catalina.authenticator.AuthenticatorBase", "nativeMethod": false }, { "methodName": "invoke", "fileName": "StandardHostValve.java", "lineNumber": 139, "className": "org.apache.catalina.core.StandardHostValve", "nativeMethod": false }, { "methodName": "invoke", "fileName": "ErrorReportValve.java", "lineNumber": 92, "className": "org.apache.catalina.valves.ErrorReportValve", "nativeMethod": false }, { "methodName": "invoke", "fileName": "StandardEngineValve.java", "lineNumber": 74, "className": "org.apache.catalina.core.StandardEngineValve", "nativeMethod": false }, { "methodName": "service", "fileName": "CoyoteAdapter.java", "lineNumber": 343, "className": "org.apache.catalina.connector.CoyoteAdapter", "nativeMethod": false }, { "methodName": "service", "fileName": "Http11Processor.java", "lineNumber": 408, "className": "org.apache.coyote.http11.Http11Processor", "nativeMethod": false }, { "methodName": "process", "fileName": "AbstractProcessorLight.java", "lineNumber": 66, "className": "org.apache.coyote.AbstractProcessorLight", "nativeMethod": false }, { "methodName": "process", "fileName": "AbstractProtocol.java", "lineNumber": 834, "className": "org.apache.coyote.AbstractProtocol$ConnectionHandler", "nativeMethod": false }, { "methodName": "doRun", "fileName": "NioEndpoint.java", "lineNumber": 1415, "className": "org.apache.tomcat.util.net.NioEndpoint$SocketProcessor", "nativeMethod": false }, { "methodName": "run", "fileName": "SocketProcessorBase.java", "lineNumber": 49, "className": "org.apache.tomcat.util.net.SocketProcessorBase", "nativeMethod": false }, { "methodName": "runWorker", "fileName": "ThreadPoolExecutor.java", "lineNumber": 1149, "className": "java.util.concurrent.ThreadPoolExecutor", "nativeMethod": false }, { "methodName": "run", "fileName": "ThreadPoolExecutor.java", "lineNumber": 624, "className": "java.util.concurrent.ThreadPoolExecutor$Worker", "nativeMethod": false }, { "methodName": "run", "fileName": "TaskThread.java", "lineNumber": 61, "className": "org.apache.tomcat.util.threads.TaskThread$WrappingRunnable", "nativeMethod": false }, { "methodName": "run", "fileName": "Thread.java", "lineNumber": 748, "className": "java.lang.Thread", "nativeMethod": false } ], "type": "http://www.test-api.tech/problem/problem-with-message", "title": "Not Found", "status": "NOT_FOUND", "detail": "No handler found for GET /test-app/api/v1/public/download2", "instance": null, "parameters": { "path": "/test-app/api/v1/public/download2", "message": "error.http.404" }, "message": "Not Found: No handler found for GET /test-app/api/v1/public/download2", "localizedMessage": "Not Found: No handler found for GET /test-app/api/v1/public/download2", "suppressed": [] } } }

I've customized the default response structure , so please ignore the structure.

Best.

— You are receiving this because you commented. Reply to this email directly, view it on GitHubhttps://github.com/zalando/problem-spring-web/issues/363?email_source=notifications&email_token=AHJSHJAF7TUQ5B35ZV6KJFLQN3FOHA5CNFSM4IXL43MKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEA3AJGY#issuecomment-540411035, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AHJSHJBKCWZHM6WSE3KYWW3QN3FOHANCNFSM4IXL43MA.

Nothing in this email constitutes a binding agreement, such agreements shall only be made in signed contracts. This e-mail contains confidential information intended solely for the use of the addressee(s). If you are not the intended recipient, you are not authorized to copy, disclose or distribute this e-mail or its contents to any other person and any such actions are unlawful. We have taken precautions to minimize the risk of viruses, however you should carry out your own virus checks before opening any e-mails or attachments.

atularimon commented 4 years ago

Yes, you are right @whiskeysierra . That is the issue basically. I've already tried the above suggested way already but somehow it doesn't work.

@Configuration public class JacksonConfiguration {

/*
 * Support for Hibernate types in Jackson.
 */
@Bean
public Hibernate5Module hibernate5Module() {
    return new Hibernate5Module();
}

/*
 * Jackson Afterburner module to speed up serialization/deserialization.
 */
@Bean
public AfterburnerModule afterburnerModule() {
    return new AfterburnerModule();
}

/*
 * Module for serialization/deserialization of RFC7807 Problem.
 */
@Bean
ProblemModule problemModule() {
    return new ProblemModule();
}

/*
 * Module for serialization/deserialization of ConstraintViolationProblem.
 */
@Bean
ConstraintViolationProblemModule constraintViolationProblemModule() {
    return new ConstraintViolationProblemModule();
}

}

May be i can create a dummy spring boot git project with all the configuration to explain more clearly.

Best,

whiskeysierra commented 4 years ago

May be i can create a dummy spring boot git project with all the configuration to explain more clearly.

That would be great!

ArimonConsulting commented 4 years ago

View this email in your browser (https://mailchi.mp/3aea57c2b04e/what-does-covid-19-mean-for-mortgage-lenders-6436644?e=6f48f05ab1) https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=9cbece14ed&e=6f48f05ab1 Did you miss the webinar yesterday? You can watch it again with a replay. We bring together a panel of CIOs and technology experts, who have personally experienced global crises like the financial crisis, 911, Y2k and the Dotcom bubble.

Hear from the panelists, about their personal experiences of how technology was leveraged during some of these crises, and what technology wave we can expect as a result of COVID crisis.

https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=706835369d&e=6f48f05ab1

** Technology in the time of crisis

Upcoming Webinar : Recovery Strategies for Mortgage Lenders (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=2a41d856f3&e=6f48f05ab1) Know more about our panelists Tracey Bailey, Head of Lending Transformation, Together Financial Services Limited (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=4eed9903a8&e=6f48f05ab1)

Tracey is the head of the lending transformation at together financial services limited. She has 20+ years of Operational Leadership experience both in day to day operations and in Senior Leadership position shaping and delivering change and growth throughout the entire organisation. She manages service and productivity within the organization via a strategic change programme within an ever-changing and evolving regulatory framework. Buster Tolfree, Commercial Director, United Trust Bank (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=74f1e4f611&e=6f48f05ab1)

Extensive experience in the management of large operational teams of up to 100+ staff across a variety of functions. Previous roles cover the entire product lifecycle including sales and marketing, underwriting, customer and arrears management, litigation and asset management specifically within the mortgage and consumer lending markets. V.G. Narayanan, Chair of the MBA Elective Curriculum & the Thomas D. Casserly, Jr. Professor of Business Administration, Harvard Business School (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=299e6207f3&e=6f48f05ab1)

V.G. Narayanan is the Chair of the MBA Elective Curriculum and the Thomas D. Casserly, Jr. Professor of Business Administration at the Harvard Business School. Professor Narayanan has been teaching at the Harvard Business School since 1994. He has taught courses in Financial Reporting, Measuring and Driving Corporate Performance, and Building and Sustaining a Successful Enterprise. He serves on the boards of several companies. He studies performance management, retail banks, and boards of directors. He is the author of the book: An Easy Introduction to Financial Accounting: A Self-Study Guide. https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=8867dc723c&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=8ea695225c&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=5006e3c8a4&e=6f48f05ab1

============================================================ Copyright © 2020 Digilytics, All rights reserved. You are receiving this email because you opted in via our website.

Our mailing address is: Digilytics 85 Gresham Street London, EC2V 7NQ United Kingdom Want to change how you receive these emails? You can update your preferences (https://digilytics.us4.list-manage.com/profile?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1) or unsubscribe from this list (https://digilytics.us4.list-manage.com/unsubscribe?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1&c=e327942ae8) . Email Marketing Powered by Mailchimp http://www.mailchimp.com/email-referral/?utm_source=freemium_newsletter&utm_medium=email&utm_campaign=referral_marketing&aid=607bb381448b8bef9a3d95e29&afl=1

ArimonConsulting commented 4 years ago

View this email in your browser (https://mailchi.mp/3d0ccef4b433/what-does-covid-19-mean-for-mortgage-lenders-6441348?e=6f48f05ab1) https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=6116a874ef&e=6f48f05ab1 Digilytics AI (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=17d9444fd2&e=6f48f05ab1) webinar series:“After the clapping stops: Recovery Strategies for Mortgage Lenders” (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=d6fdc419be&e=6f48f05ab1) starts tomorrow, Thursday at 9 am EDT with our CEO, Arindom Basu (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=e3f0133d4b&e=6f48f05ab1) and panel of mortgage leaders from industry and academia across the UK and the US.

Webinar's key themes will include:

As with all webinars in the series, there will also be a Q&A where you get to hear directly from panellists to get their expert opinion on all things related to the Coronavirus and mortgage markets.

This webinar promises to be extremely insightful and useful, especially for the mortgage industry. Please do not hesitate to register (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=95f76a2f95&e=6f48f05ab1) here (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=cd710d5bf5&e=6f48f05ab1) , and know more about the panellists.

See you there! https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=0702d86383&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=f75347f839&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=7ca73aeda3&e=6f48f05ab1

============================================================ Copyright © 2020 Digilytics, All rights reserved. You are receiving this email because you opted in via our website.

Our mailing address is: Digilytics 85 Gresham Street London, EC2V 7NQ United Kingdom Want to change how you receive these emails? You can update your preferences (https://digilytics.us4.list-manage.com/profile?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1) or unsubscribe from this list (https://digilytics.us4.list-manage.com/unsubscribe?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1&c=c1fd2df45d) . Email Marketing Powered by Mailchimp http://www.mailchimp.com/email-referral/?utm_source=freemium_newsletter&utm_medium=email&utm_campaign=referral_marketing&aid=607bb381448b8bef9a3d95e29&afl=1

ArimonConsulting commented 4 years ago

View this email in your browser (https://mailchi.mp/88b9ae0ae96d/what-does-covid-19-mean-for-mortgage-lenders-6445716?e=6f48f05ab1) https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=7ab7f29978&e=6f48f05ab1 Our key workers have done a tremendous job of containing the health crisis as best as they can and deserve every last clap across the country. But what of the aftermath and the economic crisis that is upon us?

How will mortgage lenders recover from the COVID crisis? What recovery strategies worked in the Financial Crisis a decade ago? Watch this on-demand webinar discussing about recovery strategies for mortgage lenders. Recorded Webinar https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=5ecaf0310c&e=6f48f05ab1 Upcoming Webinar: Recovery Strategies for SME Lenders | 21 May (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=01d17af4e2&e=6f48f05ab1) Know more about our panellists https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=99b824e931&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=2badd60b40&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=d1be740070&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=d61de0537c&e=6f48f05ab1

============================================================ Copyright © 2020 Digilytics, All rights reserved. You are receiving this email because you opted in via our website.

Our mailing address is: Digilytics 85 Gresham Street London, EC2V 7NQ United Kingdom Want to change how you receive these emails? You can update your preferences (https://digilytics.us4.list-manage.com/profile?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1) or unsubscribe from this list (https://digilytics.us4.list-manage.com/unsubscribe?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1&c=cebf7af371) . Email Marketing Powered by Mailchimp http://www.mailchimp.com/email-referral/?utm_source=freemium_newsletter&utm_medium=email&utm_campaign=referral_marketing&aid=607bb381448b8bef9a3d95e29&afl=1

ArimonConsulting commented 4 years ago

View this email in your browser (https://mailchi.mp/b207fda69abb/what-does-covid-19-mean-for-mortgage-lenders-6448124?e=6f48f05ab1) https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=24a83b18ee&e=6f48f05ab1 Digilytics AI (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=b588d8c3b2&e=6f48f05ab1) webinar series: "What next after CBILS, BBLS and PPP: SME Lending strategies post the crisis (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=5ba21d61c8&e=6f48f05ab1) " starts tomorrow, Thursday at 2 PM BST with our CEO, Arindom Basu (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=704b19692e&e=6f48f05ab1) and panel of lenders & broker leaders from the industry.

Webinar's key themes will include:

As with all webinars in the series, there will also be a Q&A where you get to hear directly from panellists to get their expert opinion on all things related to the Coronavirus and lending markets.

This webinar promises to be extremely insightful and useful, especially for the lending industry. Please do not hesitate to register here (https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=5c64364961&e=6f48f05ab1) , and know more about the panellists.

See you there! https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=929f6507b0&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=0f07e28ec5&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=7a1d553936&e=6f48f05ab1

============================================================ Copyright © 2020 Digilytics, All rights reserved. You are receiving this email because you opted in via our website.

Our mailing address is: Digilytics 85 Gresham Street London, EC2V 7NQ United Kingdom Want to change how you receive these emails? You can update your preferences (https://digilytics.us4.list-manage.com/profile?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1) or unsubscribe from this list (https://digilytics.us4.list-manage.com/unsubscribe?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1&c=10ce06153a) . Email Marketing Powered by Mailchimp http://www.mailchimp.com/email-referral/?utm_source=freemium_newsletter&utm_medium=email&utm_campaign=referral_marketing&aid=607bb381448b8bef9a3d95e29&afl=1

ArimonConsulting commented 4 years ago

View this email in your browser (https://mailchi.mp/2430634c2641/what-does-covid-19-mean-for-mortgage-lenders-6453528?e=6f48f05ab1) https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=0c7b0c1e0b&e=6f48f05ab1 Did you miss the webinar on recovery strategies for SME Lenders? You can watch it again with a replay. We bring together a panel of CIOs and technology experts, from a cross-section of broker, lender and academia.

Hear from the panellists, about their personal experiences of how technology was leveraged during some of the past crises, and what technology wave we can expect as a result of COVID crisis, especially in the SME lending industry. https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=83cfd90ff0&e=6f48f05ab1

** SME Lending Strategies Post Crisis

https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=dd2e03fe56&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=16d05c2eea&e=6f48f05ab1 https://digilytics.us4.list-manage.com/track/click?u=607bb381448b8bef9a3d95e29&id=d77ec19f4d&e=6f48f05ab1

============================================================ Copyright © 2020 Digilytics, All rights reserved. You are receiving this email because you opted in via our website.

Our mailing address is: Digilytics 85 Gresham Street London, EC2V 7NQ United Kingdom Want to change how you receive these emails? You can update your preferences (https://digilytics.us4.list-manage.com/profile?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1) or unsubscribe from this list (https://digilytics.us4.list-manage.com/unsubscribe?u=607bb381448b8bef9a3d95e29&id=c5cce855c7&e=6f48f05ab1&c=686ffc17b2) . Email Marketing Powered by Mailchimp http://www.mailchimp.com/email-referral/?utm_source=freemium_newsletter&utm_medium=email&utm_campaign=referral_marketing&aid=607bb381448b8bef9a3d95e29&afl=1