UTF-8 decoding in Spring Boot GET request to static resource












0















I have this @Bean redirecting requests to my Spring Boot backend.



@Bean
WebMvcConfigurer configurer () {
return new WebMvcConfigurerAdapter() {
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/");
}
};
}


It works perfectly for URLs such as:



http://localhost:4200/data/static/images/champion/tiles/Ahri_0.jpg



But not for URLs such as:



http://localhost:4200/data/static/images/champion/tiles/Tahm%20Kench_0.jpg



The image is correctly shown in my Angular2 front end if the champion name does not contain any of: space, ampersand or single quote characters.



I ran a trace level logging debug and made both types of requests -- one with and without a "bad" character. Currently, it seems as if the backend searches for the correct file. However, it turns out that it claims it can't find it. I quintuple checked the file in my insanity, I know it is there and that the path printed is correct.



Here is an example log message:



2018-11-18 05:07:14.496 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@4d0bdef0] in DispatcherServlet with name 'dispatcherServlet'
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are [/data/static/images/**, /**]
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are {}
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/data/static/images/champion/tiles/Tahm Kench_0.jpg] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@5b5b59]]] and 1 interceptor
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@132f4851]
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@5b8d72dc]
2018-11-18 05:07:14.498 DEBUG 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/data/static/images/champion/tiles/Tahm%20Kench_0.jpg] is: -1
2018-11-18 05:07:14.498 DEBUG 9897 --- [on(7)-127.0.0.1] sun.rmi.transport.tcp : RMI TCP Connection(7)-127.0.0.1: (port 34127) op = 82
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver : Resolving resource for request path "champion/tiles/Tahm Kench_0.jpg"
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]




EDIT: I've implemented the class in the accepted answer, and it's definitely working because I printed the resource name (after encoding the characters I had trouble with.) However, the result is still a 404 error.



Log is below. The champion/Aatrox2Epng bit is due to a println statement in the method @slimane posted below.



2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@465ac973]
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@37df7ae5]
2018-11-18 05:56:40.509 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/data/static/images/champion/Aatrox.png] is: -1
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.CachingResourceResolver : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
champion/Aatrox2Epng
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : No match for location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler : No matching resource found - returning 404
2018-11-18 05:56:40.511 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling


another EDIT -- sorry for the confusion, I changed the path because I thought paths with periods would work now.



@Bean
WebMvcConfigurer configurer () {
return new WebMvcConfigurerAdapter() {
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/8.23.1/img")
.resourceChain(true)
.addResolver(encodedPathResourceResolver());
}
};
}









share|improve this question




















  • 1





    recent logs shows [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img] but old one [file:/home/nuradin/Development/Java/riot-api-interface/**static**/img/], are you still having the same config as shown above?

    – stacker
    Nov 18 '18 at 11:26











  • No, sorry for the confusion, I changed it because I thought I'd be able to use periods in path names now. I'll double check everything but I'm pretty sure the path is correct. I've been trying permutations of all the settings for the last 6 hours editing the OP with new addResourceHandlers()

    – Nuradin
    Nov 18 '18 at 11:27








  • 1





    can you try add a / in ..../img/ i mean in your resourceLocation

    – stacker
    Nov 18 '18 at 11:36













  • Nice one, about 90% of my pictures are now loading in Angular2 under path 8.23.1 (which wasn't working before due to the . symbol) However, the ones with special characters are not yet loading. I removed all implementation except for the return in the PathResourceResolver and simply printed the resource parameter. The result is lots of entries such as: champion/Nunu%20%26%20Willump.png champion/Rek%27Sai.png champion/Twisted%20Fate.png

    – Nuradin
    Nov 18 '18 at 11:42













  • if I understand, you skipped replacing whitespace in the configuration but you still see %20 in the filename, try to replace it with a whitespace instead and see what you can get

    – stacker
    Nov 18 '18 at 12:01
















0















I have this @Bean redirecting requests to my Spring Boot backend.



@Bean
WebMvcConfigurer configurer () {
return new WebMvcConfigurerAdapter() {
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/");
}
};
}


It works perfectly for URLs such as:



http://localhost:4200/data/static/images/champion/tiles/Ahri_0.jpg



But not for URLs such as:



http://localhost:4200/data/static/images/champion/tiles/Tahm%20Kench_0.jpg



The image is correctly shown in my Angular2 front end if the champion name does not contain any of: space, ampersand or single quote characters.



I ran a trace level logging debug and made both types of requests -- one with and without a "bad" character. Currently, it seems as if the backend searches for the correct file. However, it turns out that it claims it can't find it. I quintuple checked the file in my insanity, I know it is there and that the path printed is correct.



Here is an example log message:



2018-11-18 05:07:14.496 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@4d0bdef0] in DispatcherServlet with name 'dispatcherServlet'
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are [/data/static/images/**, /**]
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are {}
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/data/static/images/champion/tiles/Tahm Kench_0.jpg] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@5b5b59]]] and 1 interceptor
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@132f4851]
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@5b8d72dc]
2018-11-18 05:07:14.498 DEBUG 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/data/static/images/champion/tiles/Tahm%20Kench_0.jpg] is: -1
2018-11-18 05:07:14.498 DEBUG 9897 --- [on(7)-127.0.0.1] sun.rmi.transport.tcp : RMI TCP Connection(7)-127.0.0.1: (port 34127) op = 82
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver : Resolving resource for request path "champion/tiles/Tahm Kench_0.jpg"
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]




EDIT: I've implemented the class in the accepted answer, and it's definitely working because I printed the resource name (after encoding the characters I had trouble with.) However, the result is still a 404 error.



Log is below. The champion/Aatrox2Epng bit is due to a println statement in the method @slimane posted below.



2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@465ac973]
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@37df7ae5]
2018-11-18 05:56:40.509 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/data/static/images/champion/Aatrox.png] is: -1
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.CachingResourceResolver : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
champion/Aatrox2Epng
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : No match for location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler : No matching resource found - returning 404
2018-11-18 05:56:40.511 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling


another EDIT -- sorry for the confusion, I changed the path because I thought paths with periods would work now.



@Bean
WebMvcConfigurer configurer () {
return new WebMvcConfigurerAdapter() {
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/8.23.1/img")
.resourceChain(true)
.addResolver(encodedPathResourceResolver());
}
};
}









share|improve this question




















  • 1





    recent logs shows [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img] but old one [file:/home/nuradin/Development/Java/riot-api-interface/**static**/img/], are you still having the same config as shown above?

    – stacker
    Nov 18 '18 at 11:26











  • No, sorry for the confusion, I changed it because I thought I'd be able to use periods in path names now. I'll double check everything but I'm pretty sure the path is correct. I've been trying permutations of all the settings for the last 6 hours editing the OP with new addResourceHandlers()

    – Nuradin
    Nov 18 '18 at 11:27








  • 1





    can you try add a / in ..../img/ i mean in your resourceLocation

    – stacker
    Nov 18 '18 at 11:36













  • Nice one, about 90% of my pictures are now loading in Angular2 under path 8.23.1 (which wasn't working before due to the . symbol) However, the ones with special characters are not yet loading. I removed all implementation except for the return in the PathResourceResolver and simply printed the resource parameter. The result is lots of entries such as: champion/Nunu%20%26%20Willump.png champion/Rek%27Sai.png champion/Twisted%20Fate.png

    – Nuradin
    Nov 18 '18 at 11:42













  • if I understand, you skipped replacing whitespace in the configuration but you still see %20 in the filename, try to replace it with a whitespace instead and see what you can get

    – stacker
    Nov 18 '18 at 12:01














0












0








0








I have this @Bean redirecting requests to my Spring Boot backend.



@Bean
WebMvcConfigurer configurer () {
return new WebMvcConfigurerAdapter() {
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/");
}
};
}


It works perfectly for URLs such as:



http://localhost:4200/data/static/images/champion/tiles/Ahri_0.jpg



But not for URLs such as:



http://localhost:4200/data/static/images/champion/tiles/Tahm%20Kench_0.jpg



The image is correctly shown in my Angular2 front end if the champion name does not contain any of: space, ampersand or single quote characters.



I ran a trace level logging debug and made both types of requests -- one with and without a "bad" character. Currently, it seems as if the backend searches for the correct file. However, it turns out that it claims it can't find it. I quintuple checked the file in my insanity, I know it is there and that the path printed is correct.



Here is an example log message:



2018-11-18 05:07:14.496 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@4d0bdef0] in DispatcherServlet with name 'dispatcherServlet'
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are [/data/static/images/**, /**]
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are {}
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/data/static/images/champion/tiles/Tahm Kench_0.jpg] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@5b5b59]]] and 1 interceptor
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@132f4851]
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@5b8d72dc]
2018-11-18 05:07:14.498 DEBUG 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/data/static/images/champion/tiles/Tahm%20Kench_0.jpg] is: -1
2018-11-18 05:07:14.498 DEBUG 9897 --- [on(7)-127.0.0.1] sun.rmi.transport.tcp : RMI TCP Connection(7)-127.0.0.1: (port 34127) op = 82
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver : Resolving resource for request path "champion/tiles/Tahm Kench_0.jpg"
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]




EDIT: I've implemented the class in the accepted answer, and it's definitely working because I printed the resource name (after encoding the characters I had trouble with.) However, the result is still a 404 error.



Log is below. The champion/Aatrox2Epng bit is due to a println statement in the method @slimane posted below.



2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@465ac973]
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@37df7ae5]
2018-11-18 05:56:40.509 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/data/static/images/champion/Aatrox.png] is: -1
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.CachingResourceResolver : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
champion/Aatrox2Epng
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : No match for location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler : No matching resource found - returning 404
2018-11-18 05:56:40.511 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling


another EDIT -- sorry for the confusion, I changed the path because I thought paths with periods would work now.



@Bean
WebMvcConfigurer configurer () {
return new WebMvcConfigurerAdapter() {
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/8.23.1/img")
.resourceChain(true)
.addResolver(encodedPathResourceResolver());
}
};
}









share|improve this question
















I have this @Bean redirecting requests to my Spring Boot backend.



@Bean
WebMvcConfigurer configurer () {
return new WebMvcConfigurerAdapter() {
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/");
}
};
}


It works perfectly for URLs such as:



http://localhost:4200/data/static/images/champion/tiles/Ahri_0.jpg



But not for URLs such as:



http://localhost:4200/data/static/images/champion/tiles/Tahm%20Kench_0.jpg



The image is correctly shown in my Angular2 front end if the champion name does not contain any of: space, ampersand or single quote characters.



I ran a trace level logging debug and made both types of requests -- one with and without a "bad" character. Currently, it seems as if the backend searches for the correct file. However, it turns out that it claims it can't find it. I quintuple checked the file in my insanity, I know it is there and that the path printed is correct.



Here is an example log message:



2018-11-18 05:07:14.496 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@4d0bdef0] in DispatcherServlet with name 'dispatcherServlet'
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are [/data/static/images/**, /**]
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are {}
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/data/static/images/champion/tiles/Tahm Kench_0.jpg] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@5b5b59]]] and 1 interceptor
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@132f4851]
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@5b8d72dc]
2018-11-18 05:07:14.498 DEBUG 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/data/static/images/champion/tiles/Tahm%20Kench_0.jpg] is: -1
2018-11-18 05:07:14.498 DEBUG 9897 --- [on(7)-127.0.0.1] sun.rmi.transport.tcp : RMI TCP Connection(7)-127.0.0.1: (port 34127) op = 82
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver : Resolving resource for request path "champion/tiles/Tahm Kench_0.jpg"
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]




EDIT: I've implemented the class in the accepted answer, and it's definitely working because I printed the resource name (after encoding the characters I had trouble with.) However, the result is still a 404 error.



Log is below. The champion/Aatrox2Epng bit is due to a println statement in the method @slimane posted below.



2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@465ac973]
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@37df7ae5]
2018-11-18 05:56:40.509 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/data/static/images/champion/Aatrox.png] is: -1
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.CachingResourceResolver : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
champion/Aatrox2Epng
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver : No match for location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler : No matching resource found - returning 404
2018-11-18 05:56:40.511 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling


another EDIT -- sorry for the confusion, I changed the path because I thought paths with periods would work now.



@Bean
WebMvcConfigurer configurer () {
return new WebMvcConfigurerAdapter() {
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/8.23.1/img")
.resourceChain(true)
.addResolver(encodedPathResourceResolver());
}
};
}






spring encoding utf-8 get character-encoding






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 18 '18 at 11:29







Nuradin

















asked Nov 18 '18 at 10:08









NuradinNuradin

6219




6219








  • 1





    recent logs shows [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img] but old one [file:/home/nuradin/Development/Java/riot-api-interface/**static**/img/], are you still having the same config as shown above?

    – stacker
    Nov 18 '18 at 11:26











  • No, sorry for the confusion, I changed it because I thought I'd be able to use periods in path names now. I'll double check everything but I'm pretty sure the path is correct. I've been trying permutations of all the settings for the last 6 hours editing the OP with new addResourceHandlers()

    – Nuradin
    Nov 18 '18 at 11:27








  • 1





    can you try add a / in ..../img/ i mean in your resourceLocation

    – stacker
    Nov 18 '18 at 11:36













  • Nice one, about 90% of my pictures are now loading in Angular2 under path 8.23.1 (which wasn't working before due to the . symbol) However, the ones with special characters are not yet loading. I removed all implementation except for the return in the PathResourceResolver and simply printed the resource parameter. The result is lots of entries such as: champion/Nunu%20%26%20Willump.png champion/Rek%27Sai.png champion/Twisted%20Fate.png

    – Nuradin
    Nov 18 '18 at 11:42













  • if I understand, you skipped replacing whitespace in the configuration but you still see %20 in the filename, try to replace it with a whitespace instead and see what you can get

    – stacker
    Nov 18 '18 at 12:01














  • 1





    recent logs shows [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img] but old one [file:/home/nuradin/Development/Java/riot-api-interface/**static**/img/], are you still having the same config as shown above?

    – stacker
    Nov 18 '18 at 11:26











  • No, sorry for the confusion, I changed it because I thought I'd be able to use periods in path names now. I'll double check everything but I'm pretty sure the path is correct. I've been trying permutations of all the settings for the last 6 hours editing the OP with new addResourceHandlers()

    – Nuradin
    Nov 18 '18 at 11:27








  • 1





    can you try add a / in ..../img/ i mean in your resourceLocation

    – stacker
    Nov 18 '18 at 11:36













  • Nice one, about 90% of my pictures are now loading in Angular2 under path 8.23.1 (which wasn't working before due to the . symbol) However, the ones with special characters are not yet loading. I removed all implementation except for the return in the PathResourceResolver and simply printed the resource parameter. The result is lots of entries such as: champion/Nunu%20%26%20Willump.png champion/Rek%27Sai.png champion/Twisted%20Fate.png

    – Nuradin
    Nov 18 '18 at 11:42













  • if I understand, you skipped replacing whitespace in the configuration but you still see %20 in the filename, try to replace it with a whitespace instead and see what you can get

    – stacker
    Nov 18 '18 at 12:01








1




1





recent logs shows [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img] but old one [file:/home/nuradin/Development/Java/riot-api-interface/**static**/img/], are you still having the same config as shown above?

– stacker
Nov 18 '18 at 11:26





recent logs shows [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img] but old one [file:/home/nuradin/Development/Java/riot-api-interface/**static**/img/], are you still having the same config as shown above?

– stacker
Nov 18 '18 at 11:26













No, sorry for the confusion, I changed it because I thought I'd be able to use periods in path names now. I'll double check everything but I'm pretty sure the path is correct. I've been trying permutations of all the settings for the last 6 hours editing the OP with new addResourceHandlers()

– Nuradin
Nov 18 '18 at 11:27







No, sorry for the confusion, I changed it because I thought I'd be able to use periods in path names now. I'll double check everything but I'm pretty sure the path is correct. I've been trying permutations of all the settings for the last 6 hours editing the OP with new addResourceHandlers()

– Nuradin
Nov 18 '18 at 11:27






1




1





can you try add a / in ..../img/ i mean in your resourceLocation

– stacker
Nov 18 '18 at 11:36







can you try add a / in ..../img/ i mean in your resourceLocation

– stacker
Nov 18 '18 at 11:36















Nice one, about 90% of my pictures are now loading in Angular2 under path 8.23.1 (which wasn't working before due to the . symbol) However, the ones with special characters are not yet loading. I removed all implementation except for the return in the PathResourceResolver and simply printed the resource parameter. The result is lots of entries such as: champion/Nunu%20%26%20Willump.png champion/Rek%27Sai.png champion/Twisted%20Fate.png

– Nuradin
Nov 18 '18 at 11:42







Nice one, about 90% of my pictures are now loading in Angular2 under path 8.23.1 (which wasn't working before due to the . symbol) However, the ones with special characters are not yet loading. I removed all implementation except for the return in the PathResourceResolver and simply printed the resource parameter. The result is lots of entries such as: champion/Nunu%20%26%20Willump.png champion/Rek%27Sai.png champion/Twisted%20Fate.png

– Nuradin
Nov 18 '18 at 11:42















if I understand, you skipped replacing whitespace in the configuration but you still see %20 in the filename, try to replace it with a whitespace instead and see what you can get

– stacker
Nov 18 '18 at 12:01





if I understand, you skipped replacing whitespace in the configuration but you still see %20 in the filename, try to replace it with a whitespace instead and see what you can get

– stacker
Nov 18 '18 at 12:01












1 Answer
1






active

oldest

votes


















1














define your own PathResourceResolver as below:



import org.springframework.core.io.Resource;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceResolver;
import java.io.IOException;

public class CustomPathResourceResolver extends PathResourceResolver implements ResourceResolver {

@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
//fixes problems with whitespaces in url
resourcePath = resourcePath.replace(" ","%20");
return super.getResource(resourcePath, location);
}
}


and then register it in your configuration:



@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/")
.resourceChain(true)
.addResolver(new CustomPathResourceResolver())
;
}





share|improve this answer
























  • This looks awesome, you're amazing, thanks!

    – Nuradin
    Nov 18 '18 at 10:41











  • It seems to be doing the same thing. The trace messages show that nothing has changed. I added the method to the ResourceHandler and implemented PathResourceResolver Any idea?

    – Nuradin
    Nov 18 '18 at 11:04






  • 1





    hmm, nothing has changed does it mean it didn't take into consideration your CustompathResourceResolver?

    – stacker
    Nov 18 '18 at 11:11













  • I'll update the OP

    – Nuradin
    Nov 18 '18 at 11:12











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53359733%2futf-8-decoding-in-spring-boot-get-request-to-static-resource%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














define your own PathResourceResolver as below:



import org.springframework.core.io.Resource;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceResolver;
import java.io.IOException;

public class CustomPathResourceResolver extends PathResourceResolver implements ResourceResolver {

@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
//fixes problems with whitespaces in url
resourcePath = resourcePath.replace(" ","%20");
return super.getResource(resourcePath, location);
}
}


and then register it in your configuration:



@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/")
.resourceChain(true)
.addResolver(new CustomPathResourceResolver())
;
}





share|improve this answer
























  • This looks awesome, you're amazing, thanks!

    – Nuradin
    Nov 18 '18 at 10:41











  • It seems to be doing the same thing. The trace messages show that nothing has changed. I added the method to the ResourceHandler and implemented PathResourceResolver Any idea?

    – Nuradin
    Nov 18 '18 at 11:04






  • 1





    hmm, nothing has changed does it mean it didn't take into consideration your CustompathResourceResolver?

    – stacker
    Nov 18 '18 at 11:11













  • I'll update the OP

    – Nuradin
    Nov 18 '18 at 11:12
















1














define your own PathResourceResolver as below:



import org.springframework.core.io.Resource;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceResolver;
import java.io.IOException;

public class CustomPathResourceResolver extends PathResourceResolver implements ResourceResolver {

@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
//fixes problems with whitespaces in url
resourcePath = resourcePath.replace(" ","%20");
return super.getResource(resourcePath, location);
}
}


and then register it in your configuration:



@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/")
.resourceChain(true)
.addResolver(new CustomPathResourceResolver())
;
}





share|improve this answer
























  • This looks awesome, you're amazing, thanks!

    – Nuradin
    Nov 18 '18 at 10:41











  • It seems to be doing the same thing. The trace messages show that nothing has changed. I added the method to the ResourceHandler and implemented PathResourceResolver Any idea?

    – Nuradin
    Nov 18 '18 at 11:04






  • 1





    hmm, nothing has changed does it mean it didn't take into consideration your CustompathResourceResolver?

    – stacker
    Nov 18 '18 at 11:11













  • I'll update the OP

    – Nuradin
    Nov 18 '18 at 11:12














1












1








1







define your own PathResourceResolver as below:



import org.springframework.core.io.Resource;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceResolver;
import java.io.IOException;

public class CustomPathResourceResolver extends PathResourceResolver implements ResourceResolver {

@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
//fixes problems with whitespaces in url
resourcePath = resourcePath.replace(" ","%20");
return super.getResource(resourcePath, location);
}
}


and then register it in your configuration:



@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/")
.resourceChain(true)
.addResolver(new CustomPathResourceResolver())
;
}





share|improve this answer













define your own PathResourceResolver as below:



import org.springframework.core.io.Resource;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceResolver;
import java.io.IOException;

public class CustomPathResourceResolver extends PathResourceResolver implements ResourceResolver {

@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
//fixes problems with whitespaces in url
resourcePath = resourcePath.replace(" ","%20");
return super.getResource(resourcePath, location);
}
}


and then register it in your configuration:



@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/data/static/images/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/")
.resourceChain(true)
.addResolver(new CustomPathResourceResolver())
;
}






share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 18 '18 at 10:25









stackerstacker

1,73328




1,73328













  • This looks awesome, you're amazing, thanks!

    – Nuradin
    Nov 18 '18 at 10:41











  • It seems to be doing the same thing. The trace messages show that nothing has changed. I added the method to the ResourceHandler and implemented PathResourceResolver Any idea?

    – Nuradin
    Nov 18 '18 at 11:04






  • 1





    hmm, nothing has changed does it mean it didn't take into consideration your CustompathResourceResolver?

    – stacker
    Nov 18 '18 at 11:11













  • I'll update the OP

    – Nuradin
    Nov 18 '18 at 11:12



















  • This looks awesome, you're amazing, thanks!

    – Nuradin
    Nov 18 '18 at 10:41











  • It seems to be doing the same thing. The trace messages show that nothing has changed. I added the method to the ResourceHandler and implemented PathResourceResolver Any idea?

    – Nuradin
    Nov 18 '18 at 11:04






  • 1





    hmm, nothing has changed does it mean it didn't take into consideration your CustompathResourceResolver?

    – stacker
    Nov 18 '18 at 11:11













  • I'll update the OP

    – Nuradin
    Nov 18 '18 at 11:12

















This looks awesome, you're amazing, thanks!

– Nuradin
Nov 18 '18 at 10:41





This looks awesome, you're amazing, thanks!

– Nuradin
Nov 18 '18 at 10:41













It seems to be doing the same thing. The trace messages show that nothing has changed. I added the method to the ResourceHandler and implemented PathResourceResolver Any idea?

– Nuradin
Nov 18 '18 at 11:04





It seems to be doing the same thing. The trace messages show that nothing has changed. I added the method to the ResourceHandler and implemented PathResourceResolver Any idea?

– Nuradin
Nov 18 '18 at 11:04




1




1





hmm, nothing has changed does it mean it didn't take into consideration your CustompathResourceResolver?

– stacker
Nov 18 '18 at 11:11







hmm, nothing has changed does it mean it didn't take into consideration your CustompathResourceResolver?

– stacker
Nov 18 '18 at 11:11















I'll update the OP

– Nuradin
Nov 18 '18 at 11:12





I'll update the OP

– Nuradin
Nov 18 '18 at 11:12


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53359733%2futf-8-decoding-in-spring-boot-get-request-to-static-resource%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

Tangent Lines Diagram Along Smooth Curve

Yusuf al-Mu'taman ibn Hud

Zucchini