@InitBinder 注解业务应用案例

InitBinder注解,用于初始化 WebDataBinder。这通常在业务控制器中使用,以便在数据绑定到模型对象之前对请求参数进行预处理,例如格式化日期或自定义属性编辑器。

业务场景:

假设你正在开发一个在线预订系统,用户需要输入日期和其他信息来预订服务。你希望确保所有接收到的日期参数都符合特定的格式,并且在用户没有输入日期时提供一个默认值。

1. 创建自定义属性编辑器:

java 复制代码
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.util.Date;

public class DatePropertyEditor extends PropertyEditorSupport {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        try {
            setValue(dateFormat.parse(text));
        } catch (ParseException e) {
            throw new IllegalArgumentException("Invalid date format: " + text, e);
        }
    }
}

2. 使用 @InitBinder 注解初始化 WebDataBinder

java 复制代码
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.stereotype.Controller;

@Controller
public class BookingController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 注册自定义属性编辑器
        binder.registerCustomEditor(Date.class, new DatePropertyEditor());
    }

    // 控制器的其他方法...
}

在这个控制器中,@InitBinder 注解的 initBinder 方法用于注册一个自定义的 DatePropertyEditor,它将被用来解析和格式化日期参数。

3. 控制器处理预订请求:

java 复制代码
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@PostMapping("/booking")
public String handleBooking(@RequestParam("bookingDate") Date bookingDate, BookingForm bookingForm) {
    // 使用 bookingDate 和 bookingForm 中的数据来处理预订逻辑
    // 由于使用了 @InitBinder,bookingDate 已经被格式化为期望的 Date 类型
    return "bookingConfirmation";
}

4. 表单 HTML:

HTML 复制代码
<form action="/booking" method="post">
    <label for="bookingDate">Booking Date:</label>
    <input type="text" id="bookingDate" name="bookingDate" required>
    <button type="submit">Book Now</button>
</form>

总结:

  • @InitBinder 允许开发者在数据绑定到模型之前对请求参数进行预处理,提高了数据的准确性和应用程序的健壮性。
  • 使用自定义属性编辑器,可以自定义如何处理特定类型的数据,例如日期、货币或电话号码。
  • 通过集中初始化 WebDataBinder,可以简化控制器代码,避免在每个方法中重复相同的初始化逻辑。
相关推荐
SomeB1oody6 分钟前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
ZGIAI20 分钟前
ZGI Workflow 并发控制:保护下游接口
人工智能·架构
ZGIAI26 分钟前
知识库有结果,不等于召回率合格
人工智能·架构
东小西26 分钟前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
Profile排查笔记1 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
用户938515635071 小时前
用 AI 结对编程从 0 搭一个"单词后台管理系统":Next.js + Supabase + Drizzle + shadcn/ui 全记录
后端·postgresql·next.js
mqiqe1 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
脉动数据行情1 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
爱学习的小邓同学2 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
老郑聊AI业财智造2 小时前
从“数字影子”到“智能共生体”:数字孪生的架构演进与产业落地全景剖析
架构