Spring 中的 BeanWrapper

BeanWrapper 是 Spring 框架中的一个接口,它提供了一种方式来设置和获取 JavaBean 的属性。JavaBean 是一种特殊的 Java 类,遵循特定的编码约定(例如,私有属性和公共的 getter/setter 方法),通常用于封装数据

主要功能

1.属性访问:

BeanWrapper 允许以统一的方式访问 JavaBean 对象的属性,包括简单属性、复杂类型属性、集合和数组等。它支持通过属性路径(property path)来访问嵌套对象的属性,例如 person.address.streetName。

2.类型转换:

BeanWrapper 内置了对常见类型的转换支持,可以自动处理不同数据类型的转换。

可以注册自定义的 PropertyEditor 或使用 ConversionService 来实现更复杂的类型转换逻辑。

3.属性编辑器:

可以为特定的数据类型注册 PropertyEditor,这允许在从字符串到对象或反之的转换过程中进行定制化处理。

4.错误处理:

当尝试设置非法值或访问不存在的属性时,BeanWrapper 可以捕获并报告这些错误。

访问简单属性

java 复制代码
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

public class BeanWrapperExample {
    public static void main(String[] args) {
        // 创建一个目标对象
        Person person = new Person();

        // 创建 BeanWrapper 实例
        BeanWrapper beanWrapper = new BeanWrapperImpl(person);

        // 设置属性值
        beanWrapper.setPropertyValue("name", "John Doe");
        beanWrapper.setPropertyValue("age", 30);

        // 获取属性值
        String name = (String) beanWrapper.getPropertyValue("name");
        int age = (Integer) beanWrapper.getPropertyValue("age");

        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

class Person {
    private String name;
    private int age;

    // 必须提供 getter 和 setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

访问嵌套属性

java 复制代码
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

public class NestedPropertyAccess {
    public static void main(String[] args) {
        Person person = new Person();
        Address address = new Address();
        person.setAddress(address);
        
        BeanWrapper beanWrapper = new BeanWrapperImpl(person);
        
        // 设置嵌套属性
        beanWrapper.setPropertyValue("address.street", "123 Main St");
        beanWrapper.setPropertyValue("address.city", "Springfield");
        
        // 获取嵌套属性
        String street = (String) beanWrapper.getPropertyValue("address.street");
        String city = (String) beanWrapper.getPropertyValue("address.city");
        
        System.out.println("Street: " + street); // 输出: Street: 123 Main St
        System.out.println("City: " + city);     // 输出: City: Springfield
    }
}

class Person {
    private String name;
    private int age;
    private Address address;

    // Getters and Setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public Address getAddress() { return address; }
    public void setAddress(Address address) { this.address = address; }
}

class Address {
    private String street;
    private String city;

    // Getters and Setters
    public String getStreet() { return street; }
    public void setStreet(String street) { this.street = street; }
    public String getCity() { return city; }
    public void setCity(String city) { this.city = city; }
}

自动类型转换

java 复制代码
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

public class TypeConversion {
    public static void main(String[] args) {
        Person person = new Person();
        
        BeanWrapper beanWrapper = new BeanWrapperImpl(person);
        
        // 设置属性值,自动类型转换
        beanWrapper.setPropertyValue("age", "30"); // 字符串 "30" 转换为 int 30
        
        // 获取属性值
        int age = (Integer) beanWrapper.getPropertyValue("age");
        
        System.out.println("Age: " + age); // 输出: Age: 30
    }
}

class Person {
    private String name;
    private int age;

    // Getters and Setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

注册自定义 PropertyEditor

java 复制代码
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.beans.PropertyEditorSupport;

public class CustomPropertyEditor {
    public static void main(String[] args) {
        Person person = new Person();
        
        BeanWrapper beanWrapper = new BeanWrapperImpl(person);
        
        // 注册自定义 PropertyEditor
        beanWrapper.registerCustomEditor(Date.class, new DateEditor());
        
        // 设置日期属性
        beanWrapper.setPropertyValue("birthdate", "2023-01-01");
        
        // 获取日期属性
        Date birthdate = (Date) beanWrapper.getPropertyValue("birthdate");
        
        System.out.println("Birthdate: " + birthdate); 
        // 输出: Birthdate: Sun Jan 01 00:00:00 CST 2023
    }
}

class Person {
    private String name;
    private int age;
    private Date birthdate;

    // Getters and Setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public Date getBirthdate() { return birthdate; }
    public void setBirthdate(Date birthdate) { this.birthdate = birthdate; }
}

class DateEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        try {
            setValue(new SimpleDateFormat("yyyy-MM-dd").parse(text));
        } catch (ParseException e) {
            throw new IllegalArgumentException("Invalid date format");
        }
    }
}

处理属性设置错误

java 复制代码
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.PropertyAccessException;

public class ErrorHandling {
    public static void main(String[] args) {
        Person person = new Person();
        
        BeanWrapper beanWrapper = new BeanWrapperImpl(person);
        
        try {
            // 尝试设置一个不存在的属性
            beanWrapper.setPropertyValue("invalidProperty", "value");
        } catch (PropertyAccessException e) {
            System.out.println("Error: " + e.getMessage());
// 输出: Error: Invalid property 'invalidProperty' of bean class [Person]: 
// Bean property 'invalidProperty' is not readable or has an invalid getter 
// method: Does the return type of the getter match the parameter type 
// of the setter?
        }
    }
}

class Person {
    private String name;
    private int age;

    // Getters and Setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}
相关推荐
卓越小Y15 分钟前
配置jellyfin docker 硬件加速
java·spring cloud·docker
白萝卜弟弟18 分钟前
【JAVA】正则表达式中的捕获组和非捕获组
java·正则表达式
꧁惜若༒奔已꧂30 分钟前
spring使用xml文件整合事务+druid+mybatis
xml·spring·mybatis
袁庭新38 分钟前
LuaRocks如何安装数据库驱动?
java·数据库·redis·lua·luarocks·袁庭新
hummhumm1 小时前
第 10 章 - Go语言字符串操作
java·后端·python·sql·算法·golang·database
nukix1 小时前
Mac Java 使用 tesseract 进行 ORC 识别
java·开发语言·macos·orc
月光光心慌慌。1 小时前
新日撸java三百行` 新手小白java学习记录 `Day1
java
蘑菇丁1 小时前
ranger-kms安装
java·ide·eclipse
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】内存可见性问题 & volatile
java·开发语言·java-ee
Kika写代码1 小时前
【基于轻量型架构的WEB开发】课程 13.2.4 拦截器 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis
spring·架构·java-ee