如何根据url扩展返回xml或json响应

问题描述 投票:0回答:1

我有一个基于 jaxrs 构建的 java 服务,它根据 url 扩展返回响应。 例如:http://localhost:8080/employees 默认返回 xml,http://localhost:8080/employees.json 返回 json 数据。

所以有很多服务和UI使用这个Jaxrs服务,现在我正在从jaxrs转换这个服务,基于spring的restservice,如何使用基于spring的restcontroller复制相同的东西。

如果我通过接受:application/json或application/xml,它工作正常,但我正在寻找Url扩展的解决方案。

我尝试过 1)WebMvcConfigurer 2)拦截器/过滤器,但没有任何效果

1) WebMvcConfigurer

package com.example.spring_rest_to_graphql;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(true)
                  .favorParameter(false)
                  .ignoreAcceptHeader(true)
                  .useRegisteredExtensionsOnly(true)
                  .defaultContentType(MediaType.APPLICATION_JSON)
                  .mediaType("json", MediaType.APPLICATION_JSON)
                  .mediaType("xml", MediaType.APPLICATION_XML);
    }
}

2)拦截器/过滤器

package com.example.spring_rest_to_graphql;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class ContentNegotiationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        if (requestURI.endsWith(".json")) {
            response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        } else if (requestURI.endsWith(".xml")) {
            response.setContentType(MediaType.APPLICATION_XML_VALUE);
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // No implementation needed
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // No implementation needed
    }
}

因此,在所有这些更改之后,当我点击此端点 http://localhost:8080/employees 时,我收到 xml 响应,但是当我点击此端点 http://localhost:8080/employees.json 时,我收到 404 错误页面。

java spring spring-boot spring-mvc spring-restcontroller
1个回答
0
投票

您更改了响应者的 contentType,但应该更改的是请求的内容类型,不是吗?

© www.soinside.com 2019 - 2024. All rights reserved.