发现接口返回对象值变成了xml很奇怪
理论上使用@RestController注解,返回对象应该为json
但是最近写了接口却默认返回了xml格式
经调查发现,pom.xml中引入了下面组件。
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
解决方案
- 将该组件注释掉,接口返回数据恢复为json。
- 可以指定返回值类型@GetMapping(value =“/hello” ,produces=“application/json”)
- 添加配置类,调整消息转换器优先级
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebMvcConfigSort implements WebMvcConfigurer {
//写法1
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 通过遍历消息转换器列表找到 MappingJackson2HttpMessageConverter 和 MappingJackson2XmlHttpMessageConverter
// 并修改它们的顺序
HttpMessageConverter<?> jacksonConverter = null;
HttpMessageConverter<?> jacksonXmlConverter = null;
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof MappingJackson2HttpMessageConverter) {
jacksonConverter = converter;
}
if (converter instanceof MappingJackson2XmlHttpMessageConverter) {
jacksonXmlConverter = converter;
}
}
// 如果找到了对应的转换器,则进行顺序调整
if (jacksonConverter != null && jacksonXmlConverter != null) {
converters.remove(jacksonConverter);
converters.add(0, jacksonConverter);
}
}
//写法2
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON, MediaType.TEXT_XML, MediaType.APPLICATION_XML);
}
}
- 调用方法时,header中加入
- 若组件为间接引入,可使用排除组件,排除方式有两种
写法1:
<dependency>
<groupId>com.AA.AA</groupId>
<artifactId>AA-common</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
写法2:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.AA.AA</groupId>
<artifactId>AA-common</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
网上查到一种新方法,还没测试
spring.properties设置spring.xml.ignore设置为true
具体原因,可参考https://hafuhafu.com/archives/springboot-jackson-xml-result-json博主的文章