【问题标题】:PropertyEditor not called in ModelAttribute在 ModelAttribute 中未调用 PropertyEditor
【发布时间】:2013-07-22 18:00:14
【问题描述】:

作为我的标题,我有问题,我不明白为什么不能。所以,我有一个 Person 类、PersonPropertyEditor 类和 Controller。

这里是:

人物类:

public class Person {
    private String name;

    public String getName() {
        return name;
    }

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

PersonPropertyEditor 类:

public class PersonPropertyEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        Person person = new Person();
        person.setName(text);

        setValue(person);
    }
}

控制器:

    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        webDataBinder.registerCustomEditor(Person.class,
                new PersonPropertyEditor());
    }

    @RequestMapping(value = "/addPerson", method = RequestMethod.POST)
    public String homePost(
            @ModelAttribute("personConverted") Person personConverted) {
        System.out.println(personConverted.getName());
        return "redirect:/home";
    }

JSP 文件:

    <form action="addPerson" method="post">
        <input type="text" name="personConverted" />
        <input type="submit" value="Submit" />
    <form>

所以,我注册了一个自定义属性编辑器,并且在控制器中,我会从字符串转换为人对象,但是我不知道为什么当我使用 ModelAttribute 时,Spring 不会调用我的自定义属性编辑器,但是如果我使用RequestParam,就可以了。

我知道我可以使用 Converter 来做到这一点,但我只是想了解为什么 Spring 不调用它,这是 Spring 的错误?

提前致谢!

【问题讨论】:

  • 您是否尝试过使用 spring 表单标签?
  • 不,我没有,因为我只是作为示例做的,我想从字符串转换为人。如果我使用表单标签,我将使用纯 Person 模型属性。

标签: spring spring-mvc


【解决方案1】:

我使用@JsonDeserialize 解决了这个问题

@JsonDeserialize(using=DateTimeDeserializer.class)
public DateTime getPublishedUntil() {
    return publishedUntil;
}

我必须实现自定义反序列化器。

public class DateTimeDeserializer extends StdDeserializer<DateTime> {

private DateTimeFormatter formatter = DateTimeFormat.forPattern(Constants.DATE_TIME_FORMAT);

public DateTimeDeserializer(){
    super(DateTime.class);
}

@Override
public DateTime deserialize(JsonParser json, DeserializationContext context) throws IOException, JsonProcessingException {
        try {
            if(StringUtils.isBlank(json.getText())){
                return null;
            }
            return formatter.parseDateTime(json.getText());
        } catch (ParseException e) {
            return null;
        }
}

}

【讨论】:

  • 请解释您的问题
猜你喜欢
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2013-07-26
  • 2011-08-01
  • 1970-01-01
  • 2014-09-03
相关资源
最近更新 更多