Java (WebDataBinder 枚举转换)

前沿

webDataBinder 枚举类型转换 

前端和后端数据请求的时候 枚举类型

 

webDataBinder依赖于Converter实现类型转换,

若Controller方法声明的@RequestParam参数的类型不是string

webDataBinder就会自动进行数据类型转换。SpringMVC提供了常用类型的转换器,例如string到Integer、String到Date,

string到Boolean等等,其中也包括string到枚举类型,但是string到枚举类型的默认转换规则是根据实例名称"APARTMENT")

转换为枚举对象实例(ItemType.APARTMENT)若想实现code属性到枚举对象实例的转换,

 

在 Java Web 开发中,WebDataBinder 是 Spring MVC 提供的一种数据绑定机制,
用于将 HTTP 请求参数绑定到控制器方法的参数上。当我们有枚举类型参数时,需要进行类型转换,这通常需要自定义转换逻辑,以确保请求参数能够正确映射到枚举类型。

  

理解 WebDataBinder 和枚举类型转换

WebDataBinder 是 Spring 中的数据绑定器,主要用于绑定 HTTP 请求参数到 Java 对象的属性上。

在处理枚举类型时,默认的数据绑定器可能无法直接将请求参数转换为枚举类型,因此我们需要自定义转换器。

自定义枚举类型转换器

我们可以通过实现 Converter<String, YourEnum> 接口来创建一个自定义的枚举转换器。

然后,在控制器中通过 @InitBinder 方法注册这个转换器。

 

用个代码来说明

1.定义枚举类型

package com.example.demo;

public enum Status {
    NEW,
    PROCESSING,
    COMPLETED,
    CANCELLED;
}

2.创建枚举转换器

package com.example.demo;

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
public class StringToStatusConverter implements Converter<String, Status> {
    @Override
    public Status convert(String source) {
        try {
            return Status.valueOf(source.toUpperCase());
        } catch (IllegalArgumentException e) {
            throw new RuntimeException("Invalid status value: " + source);
        }
    }
}
  • 实现 Converter<String, Status> 接口,将字符串转换为枚举类型。
  • convert 方法中,通过 Status.valueOf(source.toUpperCase()) 将字符串转换为对应的枚举值,并处理非法输入。

3. 注册枚举转换器

在控制器中,通过 @InitBinder 方法注册我们自定义的枚举转换器:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/orders")
public class OrderController {

    @Autowired
    private StringToStatusConverter stringToStatusConverter;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Status.class, new CustomStatusEditor(stringToStatusConverter));
    }

    @GetMapping("/{status}")
    public String getOrderStatus(@PathVariable Status status) {
        return "Order status is " + status;
    }
}
  • 在控制器中,通过 @InitBinder 方法注册自定义的枚举转换器。
  • 使用 WebDataBinder.registerCustomEditor 方法将 Status 类型的转换逻辑注册到数据绑定器中。
  • 处理 HTTP 请求
  • 控制器中的方法 getOrderStatus 通过 @PathVariable 注解将 URL 路径参数自动转换为 Status 枚举类型。
  • 自定义的转换器将请求参数正确映射到对应的枚举值。

 自定义属性编辑器

创建一个自定义属性编辑器,处理转换逻辑:

 
package com.example.demo;

import java.beans.PropertyEditorSupport;

public class CustomStatusEditor extends PropertyEditorSupport {

    private final Converter<String, Status> converter;

    public CustomStatusEditor(Converter<String, Status> converter) {
        this.converter = converter;
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        setValue(converter.convert(text));
    }
}

 

OK 就是一种转换类型

 

posted @ 2024-06-12 12:01  -鹿-  阅读(25)  评论(0编辑  收藏  举报