将InitBinder与命令对象一起使用

时间:2018-05-11 17:51:14

标签: java spring spring-mvc

我有一个代表提交的表单对象的命令对象。如果表单输入字段中的值为空,我希望它在命令对象中为null

我读了一个显示使用InitBinder

的其他SO question

我给了那个镜头,但initBinder方法永远不会被调用。

我的控制器

package com.example;

import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import com.example.MyDTO;

@Controller
public class MyControllerImpl implements MyController {

    @InitBinder("myControllerImpl")
    public void initBinder(WebDataBinder binder) {
        System.out.println("init binder");
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }

    @Override
    public String someAction( MyDTO someDTO ) {

        System.out.println(someDTO);

        // Do something with DTO. I want blank values to be null here

        return "somePage;
    }

}

DTO

package com.example;

public class MyDTO {

    private String name;

    public String getName() {

        return name;
    }

    public String setName() {

        return name;
    }

}

我还尝试将类名添加到InitBinder注释

@InitBinder("myControllerImpl")

但它不起作用。

我缺少什么来调用init绑定器?

我正在使用Java 6和Spring 3

2 个答案:

答案 0 :(得分:1)

您需要将@ControllerAdvice添加到控制器类。

答案 1 :(得分:0)

问题是我在控制器上使用了一个界面。该实现由Spring AOP代理。为了实现这一点,我必须在界面上添加以下方法:

@InitBinder
void initBinder(WebDataBinder binder);

然后在实施中我

@Override
public void initBinder(WebDataBinder binder) {
    System.out.println("init binder!");
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}