继承AbstractHttpMessageConverter以实现自定义转换器
作者:bin我们需要将请求的内容转换为指定格式,并且响应指定格式的内容,我们可以自定义转换器。
例如内部服务使用字节流请求,我们需要将字节流转换为对应的dto
先定义个以简单的DTO
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
private String name ;
private String value;
}
自定义消息转换器 :
/**
* 自定义消息转换器 RuleMessageConverter
*/
public class RuleMessageConverter extends AbstractHttpMessageConverter<User> {
/**
* 定义消息类型
*/
public RuleMessageConverter() {
super(new MediaType("application", "x-ben", Charset.forName("UTF-8")));
}
/**
* 处理哪类,这里只处理这个一个类
* @param clazz
* @return
*/
@Override
protected boolean supports(Class<?> clazz) {
return User.class.isAssignableFrom(clazz);
}
/**
* 使用自定义的类型转换器,将内容转换
* @param clazz
* @param inputMessage
* @return
* @throws IOException
* @throws HttpMessageNotReadableException
*/
@Override
protected User readInternal(Class<? extends User> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
String[] tempArr = temp.split("#"); //由 # 隔开数据,并转化为User v对象
return new User("zengbin", "100分");
}
/**
* 定义如何输出到response,例如解析pb响应,我们需要输出字节流
*/
@Override
protected void writeInternal(User obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
String result = "name:" + obj.getName() + ",value:" + obj.getValue();
//写入响应
outputMessage.getBody().write(result.getBytes());
//吐出给客户端
outputMessage.getBody().flush();
}
}
controller层:
@GetMapping(value="/xmark", produces="application/x-ben")
@ResponseBody
public User testXml(@RequestBody User user) {
System.out.println("收到请求:");
return new User("ben", "99分");
}