Jasperreports 更新后,Spring Rest 控制器返回 XML 而不是 JSON

发布于 2025-01-11 15:15:57 字数 213 浏览 0 评论 0原文

我有一个版本为 2.6.4 的 Spring boot 项目。 在我将 jasperreports 依赖项更新到 6.19.0 后,我所有的 RestControllers 现在都返回 XML 而不是 JSON 我可以在哪里更改此设置,而无需更改

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

每个方法?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甩你一脸翔 2025-01-18 15:15:57

我今天遇到了同样的问题,我检查了 Chrome,发现它没有在 Accept 标头中添加 application/json 。
我的解决方案是创建一个包装过滤器:

@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);
    }
}

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);
    }
}
阳光下的泡沫是彩色的 2025-01-18 15:15:57

删除对 j​​ackson-dataformat-xml 的依赖也可以解决该问题。无论如何,我认为这是一个 Jasper Reports 错误(在 6.20.0 中仍然存在),我不想为其添加自定义源代码:

        <dependency>
                <groupId>net.sf.jasperreports</groupId>
                <artifactId>jasperreports</artifactId>
                <version>6.20.0</version>
                <exclusions>
                    <exclusion>
                    <groupId>com.fasterxml.jackson.dataformat</groupId>
                    <artifactId>jackson-dataformat-xml</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

Removing the dependency on jackson-dataformat-xml also fixes the issue. I think it is a Jasper Reports bug (still present in 6.20.0) anyway and I prefer not to add custom source code for it:

        <dependency>
                <groupId>net.sf.jasperreports</groupId>
                <artifactId>jasperreports</artifactId>
                <version>6.20.0</version>
                <exclusions>
                    <exclusion>
                    <groupId>com.fasterxml.jackson.dataformat</groupId>
                    <artifactId>jackson-dataformat-xml</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
我一向站在原地 2025-01-18 15:15:57

在configureContentNegotiation(ContentNegotiationConfigurer configurer)方法中设置默认类型。

@Configuration
class WebMvcConfiguration implements WebMvcConfigurer {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer)
    {
        configurer.defaultContentType(MediaType.APPLICATION_JSON);
    }
}

Set the default type in the configureContentNegotiation(ContentNegotiationConfigurer configurer) method.

@Configuration
class WebMvcConfiguration implements WebMvcConfigurer {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer)
    {
        configurer.defaultContentType(MediaType.APPLICATION_JSON);
    }
}
剩余の解释 2025-01-18 15:15:57

我可以通过删除(未使用的)spring-boot-starter-data-rest 依赖项来解决该问题。

I could resolve the issue by removing the (not used) spring-boot-starter-data-rest dependency.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文