我有UsersController方法:
@RequestMapping(value={"/new"}, method=RequestMethod.GET)
public String showCreationForm(@ModelAttribute User user){
return "user_registration_form";
}
显示注册表格。我希望在我的项目中保持模块化(在其他项目中使用此控制器会很好),因此User是一个接口,并且有它的实现 - UserImpl。问题是Spring无法实现用户界面的实例化。有没有办法配置spring来使用User的一些默认实现?
答案 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";
}
这使您可以保持代码通用。要在不同的应用程序中使用同一类,只需添加一个不同的转换器即可。