当前位置:   article > 正文

SpringMVC 配置请求参数String 转Date 全局转换器_[java.lang.string] to type [@org.springframework.w

[java.lang.string] to type [@org.springframework.web.bind.annotation.request

问题描述:SpringMVC 请求接收前端发送过来的请求参数提示如下错误信息:

org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam java.util.Date]

错误含义:RequestParam 无法将String 转换为Date

 RequestParam源码分析:Spring 注解面面通 之 @RequestParam参数绑定源码解析

针对上述问题的解决方法总结:

第一:使用@DateTimeFormat  注解,接收日期格式数据

  • 项目编译为JDK1.7、1.8以及更高版本,会自动支持@DateTimeFormat注解 .
  • 低版本的话需要引入 joda-time jar包

实战:

  1. @ApiOperation(value = "列表:搜索客户信息", notes = "传入 用户姓名、标记")
  2. @ApiImplicitParams({ @ApiImplicitParam(name = "name", value = "用户姓名", paramType = "query", dataType = "String"),
  3. @ApiImplicitParam(name = "mark", value = "性别", paramType = "query", dataType = "Integer"), })
  4. @RequestMapping(value = "/list", method = RequestMethod.GET)
  5. public CommonResult<List<ConnectInfo>> list(@RequestParam(required = false) Long userId, @RequestParam(required = false) Long customerId,
  6. @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDt,@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDt) {
  7. return CommonResult.success(connectInfoService.list(userId, customerId, startDt, endDt));
  8. }

第二:编写全局日期转换器

实战:

  1. package com.zzg.crm.config;
  2. import java.text.DateFormat;
  3. import java.text.ParseException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.ArrayList;
  6. import java.util.Date;
  7. import java.util.List;
  8. import javax.annotation.PostConstruct;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.context.annotation.Bean;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.core.convert.ConversionService;
  13. import org.springframework.core.convert.converter.Converter;
  14. import org.springframework.core.convert.support.GenericConversionService;
  15. import org.springframework.util.StringUtils;
  16. import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
  17. import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
  18. /**
  19. * 定义系统全局转换器
  20. *
  21. * @author zzg
  22. *
  23. */
  24. @Configuration
  25. public class ConversionConfig {
  26. /**
  27. * String->Date 日期格式转换器
  28. *
  29. * @author zzg
  30. *
  31. */
  32. class StringToDateConverter implements Converter<String, Date> {
  33. private final List<DateFormat> formarts = new ArrayList<>(5);
  34. public void init() {
  35. formarts.add(new SimpleDateFormat("yyyy-MM"));
  36. formarts.add(new SimpleDateFormat("yyyy-MM-dd"));
  37. formarts.add(new SimpleDateFormat("yyyy-MM-dd hh:mm"));
  38. formarts.add(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
  39. formarts.add(new SimpleDateFormat("yyyy.MM.dd"));
  40. }
  41. @Override
  42. public Date convert(String value) {
  43. // TODO Auto-generated method stub
  44. if (StringUtils.isEmpty(value)) {
  45. return null;
  46. }
  47. // 初始化formarts 数据
  48. this.init();
  49. value = value.trim();
  50. try {
  51. if (value.matches("^\\d{4}-\\d{1,2}$")) {
  52. return formarts.get(0).parse(value);
  53. } else if (value.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
  54. return formarts.get(1).parse(value);
  55. } else if (value.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
  56. return formarts.get(2).parse(value);
  57. } else if (value.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
  58. return formarts.get(3).parse(value);
  59. } else if (value.matches("^\\d{4}.\\d{1,2}.\\d{1,2}$")) {
  60. return formarts.get(4).parse(value);
  61. }
  62. } catch (ParseException e) {
  63. System.out.print(e.getMessage());
  64. }
  65. return null;
  66. }
  67. }
  68. @Autowired
  69. private RequestMappingHandlerAdapter handlerAdapter;
  70. /**
  71. * 增加字符串转日期的功能
  72. */
  73. @PostConstruct
  74. public void initEditableAvlidation() {
  75. ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) handlerAdapter
  76. .getWebBindingInitializer();
  77. if (initializer.getConversionService() != null) {
  78. GenericConversionService genericConversionService = (GenericConversionService) initializer
  79. .getConversionService();
  80. genericConversionService.addConverter(new StringToDateConverter());
  81. }
  82. }
  83. }
  1. @ApiOperation(value = "分页:搜索客户信息", notes = "传入 名称、标记、第几页、页大小")
  2. @ApiImplicitParams({ @ApiImplicitParam(name = "name", value = "名称", paramType = "query", dataType = "String"),
  3. @ApiImplicitParam(name = "mark", value = "标记", paramType = "query", dataType = "Integer"),
  4. @ApiImplicitParam(name = "pageNum", value = "第几页", paramType = "query", dataType = "Integer", required = true),
  5. @ApiImplicitParam(name = "pageSize", value = "页大小", paramType = "query", dataType = "Integer", required = true), })
  6. @RequestMapping(value = "/page", method = RequestMethod.GET)
  7. public CommonResult<CommonPage<ConnectInfoDTO>> page(@RequestParam(required = false) Long userId, @RequestParam(required = false) Long customerId,
  8. @RequestParam(required = false) Date startDt,@RequestParam(required = false) Date endDt,
  9. @RequestParam Integer pageNum, @RequestParam Integer pageSize) {
  10. long total = connectInfoService.pageTotal(userId, customerId, startDt, endDt);
  11. return CommonResult.success(
  12. CommonPage.restPage(connectInfoService.page(userId, customerId, startDt, endDt, pageNum, pageSize), total, pageNum, pageSize));
  13. }

第三:参数改为String类型,在后端处理String到Date的转换,而不是交给SpringMVC来处理。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号