springBoot中⾃定义参数类型转换
⼀、缘起
由于⼯作中的项⽬需要与第三⽅进⾏联调,在对⽅调⽤我⽅的接⼝中请求接受Content-Type 为application/x-www-form-urlencoded,但是针对该请求⽅式的springBoot中⽆法封装复杂类型的参数 例如⼀个VO对象中含有1、Date类型或者2、List对象
本⽚博⽂针对其中的两个问题进⾏解决。
⼆、解决⽅式
1、构造VO对象
Order对象
/**
* author  xieqx
* date  2018/9/7
* 订单信息
*/
public class Order {
/**
* 订单id
*/
private Long orderId;
/**
* 订单编号
*/
private String orderNo;
/
**
* 预定时间默认情况下的⽇期类型也⽆法进⾏封装需要添加⾃定义的预定时间
*/
private Date bookingTime;
/**
* 订单详情列表,controller封装的order对象中如果没有⾃定义的类型转换,默认情况下⽆法正确的封装
*/
private List<OrderDetail> orderDetailList;
...省略seter getter⽅法
OrderDetail对象
* 订单详情
* 使⽤了lombok框架简化了bean的创建
*/
@AllArgsConstructor
@Getter
@Setter
public class OrderDetail {
private Long productId;
private String productName;
/**
* ⽇期类型
*/
private Date  buyTime;
}
2、编写⾃定义的类型转换器
2.1 String类型转换为Date类型
继承Spring提供的verter.Converter对象,重写其中的convert()⽅法 其中是⾃⼰的转换逻辑。
/**
* author  xieqx
* date  2018/9/4
* 将String 转换为Date集合
*/
public class StringToDateConverter implements Converter<String, Date> {
@Nullable
@Override
public Date convert(String json) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
return simpleDateFormat.parse(json);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
2.2 String类型转换为List集合类型
与2.1转换Date类型相似 这⾥使⽤了jackson框架进⾏转换
* 将String 转换为list集合
*/
public class StringToListConverter  implements Converter<String, List<OrderDetail>> {
@Override
public List<OrderDetail> convert(String json) {
List<OrderDetail> priceDetails = JsonUtil.str2List(json,OrderDetail.class);
return  priceDetails;
}
}
2.3 转换类完成后,还需要将其交由Spring的容器进⾏处理,这⾥提供了两种⽅式
1、继承WebMvcConfigurationSupport类并将该对象创建进⾏添加
@Configuration
public class ApplicationConfig extends WebMvcConfigurationSupport {
/**
* 添加静态资源⽂件
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/img").addResourceLocations("/img/");
string转date的方法registry.addResourceHandler("/static/css").addResourceLocations("/css/");
registry.addResourceHandler("/static/js").addResourceLocations("/js/");
registry.addResourceHandler("/static/swf").addResourceLocations("/swf/");
registry.addResourceHandler("/static/media").addResourceLocations("/media/");
}
/**
* 添加⾃定义的Converters和Formatters.
*/
@Override
protected void addFormatters(FormatterRegistry registry) {
/
/添加字符串转换list的⾃定义转换器
registry.addConverter(new StringToListConverter());
//添加字符串转换Date的⾃定义转换器
registry.addConverter(new StringToDateConverter());
}
}
使⽤该⽅式会破坏SpringBoot默认加载静态⽂件的默认配置,需要重新进⾏添加. 切记  2、第⼆种⽅式
@Configuration
public class SpringDataConvert {
@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
/
**
* 增加字符串转换为List集合
*/
@PostConstruct
public void addConversionConfig() {
ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) WebBindingInitializer();        if (ConversionService() != null) {
GenericConversionService genericConversionService = (ConversionService();
//添加字符串转换为list集合的转换机器
genericConversionService.addConverter(new StringToListConverter());
/
/添加字符串转换为⽇期类型的字符串
genericConversionService.addConverter(new StringToDateConverter());
}
}
}
2.4 编写controller进⾏测试
@Controller
@RequestMapping("/api")
public class DateConvertController {
private static final Logger logger = Logger(DateConvertController.class);
/**
*
* @param order 订单信息
* @return  请求⽅式为application/x-www-form-urlencoded
*/
@ResponseBody
@RequestMapping(value = "test",method = RequestMethod.POST,
consumes = "application/x-www-form-urlencoded",produces = "application/json")
public Object checkInventoryForm(Order order){
if(order==null){
throw new RuntimeException("the hotelOrder is null");
}
return order;
}
}
3、启动测试
3.1、不添加⽇期类型转换器的post请求
3.2  不添加List类型转换
3.3、⾃定义的类型转换器都注册上

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。