5

我有带有方法的用户控制器:

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

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

4

2 回答 2

4

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

@ModelAttribute
public User createUser() {
    return new UserImpl();
}
于 2012-08-30T12:38:17.463 回答
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";
}

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

于 2020-08-01T00:49:34.847 回答