我在Spring应用程序中遵循此方案.
我在另一个问题中询问,在填充请求的参数之前,准备对象的最佳方法是什么.答案是最好的方法是使用转换服务,而不是在@ModelAtribute注释方法中或在initBinder中使用编辑器.
所以我试图使用转换器,但我没有找到类似的例子,我有点卡住了.我编写了如下代码:在init binder中我注册了转换服务.因此,在填充User对象上的值之前,会调用convert()方法从数据库加载对象.问题是这个配置不起作用,因为它将对象用户的id(用户名字段)转换为Object用户,但是它尝试用对象创建一个setUsername(),所以我得到一个"java.lang" .IllegalArgumentException:参数类型不匹配".
任何人都可以给我一个线索或使用ConversionService获得所需行为的方式的示例吗?
谢谢.
@Autowired
private ConversionService conversionService;
@InitBinder("user")
public void initBinder(@RequestParam("username")String username, WebDataBinder binder){
binder.setConversionService(conversionService);
}
@RequestMapping(value="/user/save", method=RequestMethod.POST)
public String save(@ModelAttribute("user") User user, Model model) {
...
}
Run Code Online (Sandbox Code Playgroud)
有类似的东西:
@Component
public class UserConversionService implements ConversionService{
...
@Override
public Object convert(Object name, TypeDescriptor arg1, TypeDescriptor arg2) {
return userService.find((String)name);
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下控制器返回视图:
@RequestMapping(value = "/admin/adminUsers", method = RequestMethod.GET)
public String adminUsers(ModelMap model, HttpSession session) {
Set<TerminalAdmin> users = terminalAdminService.getAllAdmins();
session.setAttribute("users", users);
model.addAttribute("adminRoles", terminalAdminService.findAllAdminRoles());
model.addAttribute("terminalAdmin", new TerminalAdmin());
model.addAttribute("generatedPassword", PasswordUpdateStatus.generatePassword());
return "admin/adminUsers";
}
terminalAdminService.findAllAdminRoles()
Run Code Online (Sandbox Code Playgroud)
返回带有id的集合:
在jsp上我渲染它像这样:
<form:form modelAttribute="terminalAdmin" action="/admin/addNewAdmin">
...
<form:checkboxes items="${adminRoles}" path="adminRoles"/>
...
</form:form>
Run Code Online (Sandbox Code Playgroud)
我有以下控制器来接受这个对象:
@RequestMapping(value = "/admin/addNewAdmin")
public String adminUsers(@ModelAttribute @Valid TerminalAdmin terminalAdmin...){
....
}
Run Code Online (Sandbox Code Playgroud)
在调试中,我看到terminalAdminadminRoles没有id.
如何解决这个问题?
PS
我正在尝试创建一个表单来编辑现有的数据库行.我正在使用Spring MVC表单标记将html自动绑定到表单后备对象.该行与另一个表有多对多的关系,我试图使用以下形式表示多个选择框:select tag;
<form:select path="rules">
<form:options items="${bundle.rules}" itemValue="name" itemLabel="name"/>
</form:select>
Run Code Online (Sandbox Code Playgroud)
我正在使用Hibernate进行持久化,因此该关系表示为Bundle pojo中的HashSet.
private Set<Rule> rules = new HashSet<Rule>(0);
Run Code Online (Sandbox Code Playgroud)
如果没有页面上的选择框,对象将正确更新到数据库,但是使用选择框,对象将不会更新到数据库,并且我在log4j日志中收到此错误,请注意此错误不会导致异常,它只在日志中可见;
DEBUG org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:256) - Data binding errors: 1
Run Code Online (Sandbox Code Playgroud)
无论我取消选择框内的项目,都会发生这种情况,整个表单拒绝正确提交.谁能帮我?
我知道如何将集合属性绑定到Spring MVC中的表单,这与此问题类似,遗憾的是,没有任何建议对我的问题有用.
spring-mvc ×3
java ×2
spring ×2
converter ×1
data-binding ×1
hibernate ×1
jsp-tags ×1
spring-form ×1