任何人都可以在html视图中成功实现manyToMany字段,例如:
@ManyToMany
@JoinTable(name="listaDeProdutosEmDestaque", joinColumns={@JoinColumn(name="fk_destaque")}, inverseJoinColumns={@JoinColumn(name="fk_produto")})
@LazyCollection(LazyCollectionOption.FALSE)
private List<Produto> listaDeProdutos;
我尝试过这个选项,它们都不起作用:
<select class="form-control" name="listaDeProdutos[]" multiple="multiple" rows="7">
...
<option value="1">one</option>
...
</select>
我收到错误:NumberFormatException: For input string: ""
。
<select class="form-control" name="listaDeProdutos" multiple="multiple" rows="7">
...
<option value="1">one</option>
...
</select>
表单无错误地提交,但数据库中没有存储选定的选项
<select class="form-control" name="listaDeProdutos.id" multiple="multiple" rows="7">
...
<option value="1">one</option>
...
</select>
与上一个相同:表单提交没有错误,但没有数据存储在数据库中。
更新
表单提交由此控制器/服务方法处理:
- 控制器类
@RequestMapping(value = "cadastra", method=RequestMethod.POST)
@ResponseBody
public void cadastra(@ModelAttribute("object") E object, BindingResult result, @RequestParam(value="icone", required=false) MultipartFile icone, @RequestParam(value="fotos", required=false) MultipartFile fotos[], @RequestParam(value="arquivo", required=false) MultipartFile arquivo[]) throws Exception {
serv.cadastra(object);
serv.upload(object, icone);
serv.upload_multiplo(object, fotos);
serv.upload_jar(object, arquivo);
}
- 服务类
@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.this.name)")
@Transactional
public void cadastra(E object) {
dao.insert(object);
}
视图以这种方式映射:
- 控制器类
@RequestMapping(value = "cadastra")
@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.this.name)")
@Menu(label = "cadastra")
public String cadastra(Model model) throws Exception {
model.addAttribute("command", serv.newObject());
return "private/cadastra";
}
- 服务类
public E newObject() throws Exception {
return (E) clazz.newInstance();
}
更新2
在控制器中:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Pagina.class, new PaginaEditor());
binder.registerCustomEditor(Produto.class, new ProdutoEditor());
}
属性编辑器类:
@Component
public class ProdutoEditor extends PropertyEditorSupport {
@Autowired
private ProdutoService produtoService;
@Override
public void setAsText(String text) {
System.out.println("produtoEditor");
if (!text.equals("")) {
System.out.println("not empty");
Produto produto = produtoService.getObject(text);
setValue(produto);
} else {
System.out.println("empty");
setValue(null);
}
}
}
答案 0 :(得分:1)
尝试
<select class="form-control" name="listaDeProdutos[0].id" rows="7">
...
<option value="1">one</option>
...
</select>
只是在索引0处添加一个,然后通过javascript处理正确的索引/值并添加/删除选择下拉列表。
无论如何,你也可以尝试这个:
<select class="form-control" name="listaDeProdutos[].id" multiple="multiple" rows="7">
...
<option value="1">one</option>
...
</select>
答案 1 :(得分:0)
我设法解决此问题,将Property Editor类更改为:
@Component
public class ProdutoEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) {
if (!text.equals("")) {
ProdutoService serv = new ProdutoService();
ApplicationContextHolder.getContext().getAutowireCapableBeanFactory().autowireBean(serv);
Produto produto = serv.getObject(text);
setValue(produto);
} else {
setValue(null);
}
}
}
使用此选择代码:
<select class="form-control" name="listaDeProdutos" multiple="multiple" rows="7">
...
<option value="1">one</option>
...
</select>