首页 > 编程语言 >Java (WebDataBinder 枚举转换)

Java (WebDataBinder 枚举转换)

时间:2024-06-12 12:11:51浏览次数:15  
标签:Status Java 自定义 WebDataBinder 枚举 转换器 public

前沿

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 就是一种转换类型

 

标签:Status,Java,自定义,WebDataBinder,枚举,转换器,public
From: https://www.cnblogs.com/yf-html/p/18243692

相关文章

  • Java实际工作里用到的几种加密方式
    1、Base64加密最简单的加密方式,甚至可以说不是加密,只是一种用64个字符表示任意二进制数据的方法。Base64编码原理是将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8比特则高位补0),然后将这些二进制数值串联起来,再按照6比特一组进行切分(因为2^6=64),最后一组若不足6比......
  • 浅谈 Java 引用:弱引用 WeakReference
    前言最近在测试micrometer的Gauge度量时,发现被观察的目标对象,在一开始时能被采集到指标,过了一段时间后(jvm发生了gc),被观察对象的指标采集不到了,经过跟踪发现,Gauge在构建被观察对象时,使用了Java的弱引用。测试场景回溯目标为了采集httpclient的连接管理器(连接池)的指标......
  • 50.基于SSM的停车场管理系统的设计与实现|基于SSM+ Mysql+Java设计与实现(可运行源码+
    内容概要:全套项目源码+详尽文档,一站式解决您的学习与项目需求。适用人群:计算机、通信、人工智能、自动化等专业的学生、老师及从业者。使用场景及目标:无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。项目代码经过调试测试,确保直接运行,节省您的时......
  • JavaWeb开发基础 (5) :后端框架进阶(事务管理、AOP、Spring原理、Maven高级)
    JavaWeb开发基础:后端框架进阶——事务管理、AOP、Spring原理、Maven高级文章目录1事务管理1.1Spring事务管理1.2rollbackFor和propagation2AOP2.1AOP快速入门2.2核心概念2.3通知类型2.4通知顺序2.5切入点表达式[email protected]连接点案......
  • JavaScript判断数据为对象(转载)
    1.javaScript判断数据为对象1.1. Object.prototype.toString.call()2.JavaScript如何判断数据类型2.1. typeof2.2. Array.isArray()2.3. instanceof2.4. Object.prototype.toString.call()2.5. constructor2.6. 使用ES6的Symbol.toStringTa......
  • JavaEE的分层模型
    1.基本概念1.1JavaEE应用的分层模型DomainObject(领域对象):此层由一系列POJO对象组成,用于实现业务逻辑方法DAO(DataAccessObject数据访问对象)层:这层实现了对数据库的一系列操作(CRUD)业务逻辑层:由一系列业务逻辑对象组成,这些业务逻辑对象实现了DomainObject方法......
  • Java多线程CompletableFuture使用
    引言一个接口可能需要调用N个其他服务的接口,这在项目开发中非常常见。如果是串行执行的话,接口的响应速度会很慢。考虑到这些接口之间有大部分都是无前后顺序关联的,可以并行执行。就比如说调用获取商品详情的时候,可以同时调用获取物流信息,通过并行执行多个任务的方式,接口的......
  • 计算机毕业设计项目推荐,32127 爬虫-自驾游搜索系统(开题答辩+程序定制+全套文案 )上万套
    目 录摘要1绪论1.1研究背景1.2爬虫技术1.3flask框架介绍21.4论文结构与章节安排32 自驾游搜索系统分析42.1可行性分析42.2系统流程分析42.2.1数据增加流程52.3.2数据修改流程52.3.3数据删除流程52.3系统功能分析52.3.1功能性分析62.......
  • 计算机毕业设计项目推荐,32006 node 中国传统节日介绍网站(开题答辩+程序定制+全套文案
    基于node.js中国传统节日介绍网站 摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,中国传统节日介绍网站当然也不能排除在外。中国传统节日介绍网站是以实际运用为开发背景,运用软件工程原理和开发方法,采......
  • 计算机毕业设计项目推荐,29042 基于Web的医院护理管理系统的设计(开题答辩+程序定制+全
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,医院当然也不例外。医院预约管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发过程首先对软件系统进......