spring接口为@ModelAttribute param

时间:2012-08-30 12:27:42

标签: spring interface default implementation modelattribute

我有UsersController方法:

@RequestMapping(value={"/new"}, method=RequestMethod.GET)
public String showCreationForm(@ModelAttribute User user){
    return "user_registration_form";
}

显示注册表格。我希望在我的项目中保持模块化(在其他项目中使用此控制器会很好),因此User是一个接口,并且有它的实现 - UserImpl。问题是Spring无法实现用户界面的实例化。有没有办法配置spring来使用User的一些默认实现?

2 个答案:

答案 0 :(得分:4)

您可以使用@ModelAttribute - 带注释的方法提供要使用请求数据填充的对象:

@ModelAttribute
public User createUser() {
    return new UserImpl();
}

答案 1 :(得分:0)

创建一个最小化实现接口的简单类。它与接口的想法相同,但它是一个类。它不包含您的任何逻辑或验证或任何其他内容。它只是接口的最简单实现,称为UserSimple,它实现了您的接口。它称为数据传输对象。

public class UserSimple implements User {
    String name;
    String address;
    //getters and setters only
}

添加一个将UserImpl的实际属性复制到UserSimple中的转换器。

@Component
public class ImplToSimpleConverter 
        implements Converter<UserImpl, UserSimple> {

    @Override
    public UserSimple convert(UserImpl source) {
        UserSimple target = new UserSimple();
        BeanUtils.copyProperties(source, target);
        return target;
    }
    
}

在处理程序中使用UserSimple

@RequestMapping(value={"/new"}, method=RequestMethod.GET)
public String showCreationForm(@ModelAttribute UserSimple user){
    return "user_registration_form";
}

这使您可以保持代码通用。要在不同的应用程序中使用同一类,只需添加一个不同的转换器即可。