Согласование содержимого Springboot с параметром не разрешается при развертывании в качестве WAR

Я пытаюсь отформатировать тип своего ответа на @RestController между JSON и XML. Кажется, работает в случае Accept расширение заголовка или пути (.json, .xml). Мое приложение упаковано как WAR и развернуто на экземпляре tomcat. Однако в настоящее время я сталкиваюсь с 2 проблемами.

1) Хотя я установил тип содержимого по умолчанию JSON на ContentNegotiationConfigurer запрос как curl -X GET -H "Cache-Control: no-cache" http://localhost:8080/v1/api/version разрешается в XML

2) Когда я использую параметр в запросе, содержимое разрешается неправильно. При доступе curl -X GET -H "Cache-Control: no-cache" http://localhost:8080/v1/api/version?format=json Я получаю XML обратно.

Приложение SpringBoot

@EnableAutoConfiguration
@ComponentScan
@Configuration
@EnableWebMvc
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder     builder) {
        builder.sources(Application.class);
        return super.configure(builder);
    }
}

WebMvcConfigurerAdapter

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {    

    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;    

    private CustomObjectMapper objectMapper;    

    @PostConstruct
    public void init() {
        List<HttpMessageConverter<?>> messageConverters = requestMappingHandlerAdapter.getMessageConverters();
        for (HttpMessageConverter<?> messageConverter : messageConverters) {
            if (messageConverter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter m = (MappingJackson2HttpMessageConverter) messageConverter;
                m.setObjectMapper(objectMapper);
            }
        }
    }    

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


    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
        converters.add(mappingJackson2HttpMessageConverter);    

        converters.add(createXmlHttpMessageConverter());
        super.configureMessageConverters(converters);
    }    

    private HttpMessageConverter<Object> createXmlHttpMessageConverter() {
        MarshallingHttpMessageConverter xmlConverter =
                new MarshallingHttpMessageConverter();    

        XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();
        xmlConverter.setMarshaller(xstreamMarshaller);
        xmlConverter.setUnmarshaller(xstreamMarshaller);
        return xmlConverter;
    }    

    @Autowired
    public void setRequestMappingHandlerAdapter(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
        this.requestMappingHandlerAdapter  = requestMappingHandlerAdapter;
    }    

    @Autowired
    public void setObjectMapper(CustomObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }
}

Контроллер Отдыха

@RestController
@RequestMapping("/v1/api")
public class RestVersionController {    

    @ResponseStatus(HttpStatus.OK)
    @RequestMapping(value = "/version", method = RequestMethod.GET)
    public
    @ResponseBody
    ApiVersion getVersion() {
        return new ApiVersion(1);
    }    

    @JsonIgnoreProperties(ignoreUnknown = true)
    @XmlRootElement
    public static class ApiVersion {
        int version;
        String currentVersion = "Current version is ";    

        public ApiVersion() {
        }    

        public ApiVersion(int version) {
            this.version = version;
            this.currentVersion = this.currentVersion + version;
        }    

        public ApiVersion(int version, String currentVersion) {
            this.version = version;
            this.currentVersion = currentVersion;
        }    

        public int getVersion() {
            return version;
        }    

        public void setVersion(int version) {
            this.version = version;
        }    

        public String getCurrentVersion() {
            return currentVersion;
        }    

        public void setCurrentVersion(String currentVersion) {
            this.currentVersion = currentVersion;
        }
    }
}

Пример кода @ Github

Любая помощь приветствуется, спасибо!

0 ответов

Другие вопросы по тегам