Search code examples
javaspringspring-bootjasper-reports

Spring Rest Controller returns XML instead of JSON after Jasperreports update


I have a Spring boot project with version 2.6.4. And after I updated the jasperreports dependency to 6.19.0 all my RestControllers returns now XML instead of JSON Where can I change this, without changing to

@GetMapping(produces = {"application/json"})

on each method?


Solution

  • I just have same issue today, I checked with Chrome and saw it doesn't add application/json in Accept header. My solution is create a wrapper filter:

    @Component
    public class JsonRequestHeaderFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) request) {
                @Override
                public Enumeration<String> getHeaders(String name) {
                    if (name.equals("Accept")) {
                        Set<String> customHeaders = new HashSet<String>();
                        Enumeration<String> curHeaders = super.getHeaders(name);
                        while (curHeaders.hasMoreElements()) {
                            String header = curHeaders.nextElement();
                            customHeaders.add(MediaType.APPLICATION_JSON_VALUE.concat(";").concat(header));
                        }
    
                        return Collections.enumeration(customHeaders);
                    }
                    return super.getHeaders(name);
                }
            };
    
            chain.doFilter(requestWrapper, response);
        }
    }