首页 > spring > 继承AbstractHttpMessageConverter以实现自定义转换器

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

您必须 [ 登录 ] 才能发表留言!