如何在manyToMany字段中实现视图?

时间:2015-01-05 10:31:01

标签: java spring forms many-to-many submit

任何人都可以在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);
    }
  }
}

2 个答案:

答案 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>