Sring MVC 或者 SpringBoot中LocalDateTime序列化与反序列化解决方案

背景

新起一个SpringBoot项目,操作增删改查业务且入参和出参中含有LocalDateTime、LocalDate、LocalTime的序列化与反序列化问题。如在接收时间类型的参数时,报错: Failed to convert from type [java.lang.String] to type [java.time.LocalDateTime] for value '2020-12-12 00:00:00'; 而在返回给前端小朋友的LocalDateTime格式是数组格式的,让我们抓耳挠腮。 这些都是由于LocalDateTime没有合理的序列化和反序列化引起的问题。

  • 序列化:把Java对象转换为字节序列的过程。

  • 反序列化:把字节序列恢复为Java对象的过程。

解决方案

以k-v样式拼接在url的LocalDateTime参数反序列化

局部解决方案

加在参数字段上

@GetMapping("/test")
public CommonResult test(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam(required = false) LocalDateTime time) {
        System.out.println(time);
        return CommonResult.success(time);
}

全局解决方案

@ControllerAdvice
    public class ExceptionResolver {
        @InitBinder
        public void initBinder(WebDataBinder webDataBinder) {
            webDataBinder.registerCustomEdi
Spring MVC中处理`MultipartFile`的序列化反序列化,你需要确保以下几个步骤: 1. **配置MultipartResolver**: 在Spring的Web配置中,设置一个`MultipartResolver`来处理HTTP请求中的multipart content(如文件上传)。例如,可以使用`CommonsMultipartResolver`或`StandardServletMultipartResolver`。 ```java @Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("UTF-8"); return resolver; } ``` 2. **处理上传文件**: 当用户提交含有`MultipartFile`的表单时,可以在控制器方法中接受`MultipartFile`作为参数。例如: ```java @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { // 文件为空 } else { try { // 将文件保存到服务器或做其他处理 saveUploadedFile(file); } catch (IOException e) { e.printStackTrace(); } } return "redirect:/success"; } private void saveUploadedFile(MultipartFile file) throws IOException { // 实现将file的内容存储到硬盘或其他目的地 file.transferTo(new File("path/to/save")); } ``` 3. **序列化反序列化**:当需要将包含`MultipartFile`的对象转换为JSON响应时,你需要禁用Jackson对`MultipartFile`的自动序列化。可以使用`@JsonIgnoreProperties(ignoreUnknown=true)`注解忽略这个字段,或者创建一个专门的Java实体类只包含非`MultipartFile`的数据,然后手动处理`MultipartFile`部分。 ```java public class MyDto { private String otherField; @JsonIgnoreProperties(ignoreUnknown=true) private List<FileWrapper> files; // 创建一个简单封装`MultipartFile`的类 public static class FileWrapper { private String name; private MultipartFile file; } } ``` 4. **处理请求体**: 使用`@RequestBody`注解接收包含`MultipartFile`的JSON对象,并在`@Validated`注解的控制器方法中验证数据。 5. **自定义序列化逻辑**: 如果需要在返回JSON时显示文件名称而不是整个文件对象,可以创建一个自定义的`ObjectMapper`实现,使用`JsonView`或`@JsonSerialize`注解来控制序列化行为。 ```java @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(MultipartFile.class, new MultipartFileSerializer()); objectMapper.registerModule(module); converters.add(new MappingJackson2HttpMessageConverter(objectMapper)); } } ``` 这里使用了一个简单的`MultipartFileSerializer`,用于仅返回文件名而非完整对象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值