继承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分"); }