Rest 自定义 HTTP 消息转换器 Spring Boot 1.2.3
Rest Custom HTTP Message Converter Spring Boot 1.2.3
我想使用 Rest、Json、Spring Boot 1.2.3 和 Spring 4 创建自定义的 HttpMessageConverter,但是我的自定义 HTTPMessageConverter 从未调用过。
我已经执行了以下步骤:
1: 创建了一个扩展 AbstractHttpMessageConverter
的 class
@Component
public class ProductConverter extends AbstractHttpMessageConverter<Employee> {
public ProductConverter() {
super(new MediaType("application", "json", Charset.forName("UTF-8")));
System.out.println("Created ");
}
@Override
protected boolean supports(Class<?> clazz) {
return false;
}
@Override
protected Employee readInternal(Class<? extends Employee> clazz,
HttpInputMessage inputMessage) throws IOException,
HttpMessageNotReadableException {
InputStream inputStream = inputMessage.getBody();
System.out.println("Test******");
return null;
}
@Override
protected void writeInternal(Employee t,
HttpOutputMessage outputMessage) throws IOException,
HttpMessageNotWritableException {
// TODO Auto-generated method stu
}
}
2:我创建一个配置class来注册HTTPMessageConverters
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
System.out.println("Configure Message Converters");
converters.add(new ProductConverter());
super.configureMessageConverters(converters);
//super.extendMessageConverters(converters);
}
}
3:其余class方法
@RequestMapping(value="/{categoryId}" ,method=RequestMethod.POST, consumes="application/json")
@PreAuthorize("permitAll")
public ResponseEntity<ProductEntity> saveProduct(@RequestBody Employee employee , @PathVariable Long categoryId) {
logger.log(Level.INFO, "Category Id: {0}" , categoryId);
ResponseEntity<ProductEntity> responseEntity =
new ResponseEntity<ProductEntity>(HttpStatus.OK);
return responseEntity;
}
我的自定义 HTTPMessageCoverter 已创建但从未被调用?我缺少配置或步骤吗?任何输入或建议表示赞赏。
重写(AbstractHttpMessageConverter)class方法后,我发现有两个注解可以实现多态性@JsonTypeInfo和@JsonSubTypes。对于任何想要实现多态性的人都可以使用这两个注释。
我相信您想在扩展 WebMvcConfigurerAdapter 的配置 class 中使用 configureMessageConverters 方法配置这些消息转换器。我自己用 CSV 内容转换器完成了这项工作。我在下面包含了该代码。 This link shows an example as well. This link 也可能有帮助。似乎使用 Spring 配置并不总是清楚配置事物的最佳位置。 :) 如果这有帮助,请告诉我。
@Configuration
public class ApplicationWebConfiguration extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(new CsvMessageConverter());
}
}
对于转换器支持的 classes,您还需要将 supports() 方法修改为 return true。参见 the Spring doc for AbstractHttpMessageConverter supports method。
我想使用 Rest、Json、Spring Boot 1.2.3 和 Spring 4 创建自定义的 HttpMessageConverter,但是我的自定义 HTTPMessageConverter 从未调用过。
我已经执行了以下步骤:
1: 创建了一个扩展 AbstractHttpMessageConverter
的 class@Component
public class ProductConverter extends AbstractHttpMessageConverter<Employee> {
public ProductConverter() {
super(new MediaType("application", "json", Charset.forName("UTF-8")));
System.out.println("Created ");
}
@Override
protected boolean supports(Class<?> clazz) {
return false;
}
@Override
protected Employee readInternal(Class<? extends Employee> clazz,
HttpInputMessage inputMessage) throws IOException,
HttpMessageNotReadableException {
InputStream inputStream = inputMessage.getBody();
System.out.println("Test******");
return null;
}
@Override
protected void writeInternal(Employee t,
HttpOutputMessage outputMessage) throws IOException,
HttpMessageNotWritableException {
// TODO Auto-generated method stu
}
}
2:我创建一个配置class来注册HTTPMessageConverters
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
System.out.println("Configure Message Converters");
converters.add(new ProductConverter());
super.configureMessageConverters(converters);
//super.extendMessageConverters(converters);
}
}
3:其余class方法
@RequestMapping(value="/{categoryId}" ,method=RequestMethod.POST, consumes="application/json")
@PreAuthorize("permitAll")
public ResponseEntity<ProductEntity> saveProduct(@RequestBody Employee employee , @PathVariable Long categoryId) {
logger.log(Level.INFO, "Category Id: {0}" , categoryId);
ResponseEntity<ProductEntity> responseEntity =
new ResponseEntity<ProductEntity>(HttpStatus.OK);
return responseEntity;
}
我的自定义 HTTPMessageCoverter 已创建但从未被调用?我缺少配置或步骤吗?任何输入或建议表示赞赏。
重写(AbstractHttpMessageConverter)class方法后,我发现有两个注解可以实现多态性@JsonTypeInfo和@JsonSubTypes。对于任何想要实现多态性的人都可以使用这两个注释。
我相信您想在扩展 WebMvcConfigurerAdapter 的配置 class 中使用 configureMessageConverters 方法配置这些消息转换器。我自己用 CSV 内容转换器完成了这项工作。我在下面包含了该代码。 This link shows an example as well. This link 也可能有帮助。似乎使用 Spring 配置并不总是清楚配置事物的最佳位置。 :) 如果这有帮助,请告诉我。
@Configuration
public class ApplicationWebConfiguration extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(new CsvMessageConverter());
}
}
对于转换器支持的 classes,您还需要将 supports() 方法修改为 return true。参见 the Spring doc for AbstractHttpMessageConverter supports method。