SpringBoot - 自定义数据输出格式

其实SpringBoot的底层就是SpringMVC支持的,我们自定义数据输出格式的时候步骤有三个

  • 自定义的HttpMessageConverter
  • 将我们自定义的HttpMessageConverter添加到系统中去
  • 系统在接受到请求之后,就会按照我们的需要的数据类型(我们自定义数类型:application/x-custom)匹配对应的HttpMessageConverter来处理

事例JavaBean

@Data
public class Person {
    private String name;
    private Integer age;
}

自定义的HttpMessageConverter:需要告诉系统我们自定义的HttpMessageConverter支持的数据类型(application/x-custom)、告诉系统我们自定义输出数据的具体的格式(就是将Person对象的属性按照分号隔开)

public class MyHttpMessageConverter implements HttpMessageConverter<Person> {

    /**
     * 服务器会统计所有的MessageConverter支持的数据类型,所有我们这里也要告诉系统我们这个自定义的MessageConverter支持的数据类型
     * 我们这里支持的类型为:application/x-custom
     *
     * @return
     */
    @Override
    public List<MediaType> getSupportedMediaTypes() {
        return MediaType.parseMediaTypes("application/x-custom");
    }

    /**
     * 告诉系统只要是Person类型的数据我们这里自定义的MessageConverter都能写
     */
    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        return clazz.isAssignableFrom(Person.class);
    }

    /**
     * 告诉系统我们这里的application/x-custom类型的数据时什么样子的
     * (就是将Person对象的属性按照分号隔开)
     */
    @Override
    public void write(Person person, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        //自定义输出数据格式
        String retrunRsult = person.getName() + ";" + person.getAge() + ";";

        //通过OutputStream将自定义数据写出去
        OutputStream body = outputMessage.getBody();
        body.write(retrunRsult.getBytes());
        body.flush();
    }

    @Override
    public boolean canRead(Class<?> clazz, MediaType mediaType) {
        return false;
    }

    @Override
    public Person read(Class<? extends Person> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }
}

将我们自定义的HttpMessageConverter添加到系统中去

@EnableWebMvc //SpringBoot的底层就是SpringMVC的支持
@Configuration //告诉SpringBoot这是一个配置类
public class MyConfig {

    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
                MyHttpMessageConverter myHttpMessageConverter = new MyHttpMessageConverter();
                converters.add(myHttpMessageConverter);
            }
        };
    }
}

服务端写controller接受客户端请求

@RestController
public class PersonController {

    @GetMapping("/get-person")
    public Person getPerson() {
        Person person = new Person();
        person.setName("ZhangSan");
        person.setAge(18);
        return person;
    }
}

前端请求将请求头的Accept设置成我们自定的值:application/x-custom,我们就能够看到返回的数据就是按照我们自定义的格式(把Person对形象的属性按照分号隔开)返回了

Guess you like

Origin blog.csdn.net/qq_27062249/article/details/118272520