1. 程式人生 > >Spring中的自定義型別轉換器

Spring中的自定義型別轉換器

ConversionService 是 Spring 型別轉換體系的核心介面。可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC容器中定義一個 ConversionService. Spring 將自動識別出IOC 容器中的 ConversionService,並在 Bean 屬性配置及Spring MVC 處理方法入參繫結等場合使用它進行資料的轉換可通過 ConversionServiceFactoryBean 的 converters 屬性註冊自定義的型別轉換器。

Spring 定義了 3 種類型的轉換器介面,實現任意一個轉換器介面都可以作為自定義轉換器註冊到ConversionServiceFactroyBean 中:
– Converter<S,T>:將 S 型別物件轉為 T 型別物件
– ConverterFactory:將相同系列多個 “同質” Converter 封裝在一起。如果希望將一種型別的物件轉換為另一種型別及其子類的物件(例如將 String 轉換為 Number 及 Number 子類(Integer、Long、Double 等)物件)可使用該轉換器工廠類
– GenericConverter:會根據源類物件及目標類物件所在的宿主類中的上下文資訊進行型別轉換。

下面我們來完成一個字串轉換為物件的例子:

1.首先建立一個自定義轉換器,建立完畢後新增到IOC容器中:

@Component
public class EmployeeConverter implements Converter<String,Employee> {
    public Employee convert(String s) {
        if(s!=null){

            String[] vals=s.split("-");

        if (vals!=null&&vals.length==4){
                String lastName=vals[0];
                String emil=vals[1];
                Integer gender=Integer.parseInt(vals[2]);
                Department department=new Department();
                department.setId(Integer.parseInt(vals[3]));
                Employee employee=new Employee(null,lastName,emil,gender,department);
                return  employee;
        }
        }

        return null;
    }

}

2.配置ConversionService-
<bean id="conversionService"
          class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="employeeConverter"/>//類名的第一個字母小寫
            </set>
        </property>
    </bean>

3.
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>


4.在頁面上新增一個表單:

<form action="testConversionServiceConverter" method="POST">
    Employee:<input type="text" name="employee">
    <input type="submit" value="Submit">
</form>


5.新增一個控制器,相應請求:

@Controller
public class SpringMVCTest {
    @Autowired
    private EmployeeDao employeeDao;
    @RequestMapping("/testConversionServiceConverter")
    public String testConverter(@RequestParam("employee")Employee employee){
        employeeDao.save(employee);

        return "redirect:/emps";
    }
}