Pergunta

Eu estou tentando criar um formulário para editar uma linha de banco de dados existente. Eu estou usando o formulário Spring MVC tag para auto ligam o html para formar um objeto de apoio. A linha tem muitos para muitos relação com outra tabela, que eu estou tentando representar com uma caixa de seleção múltipla utilizando o formulário: selecione tag;

<form:select path="rules">
    <form:options items="${bundle.rules}" itemValue="name" itemLabel="name"/>
</form:select>

Eu estou usando Hibernate para persistência para que o relacionamento é representar como um HashSet dentro do pojo Bundle.

 private Set<Rule> rules = new HashSet<Rule>(0);

Sem a caixa de seleção na página, o objeto irá atualizar o banco de dados corretamente, no entanto com a caixa de seleção o objeto não será atualizado para o banco de dados e eu estou recebendo este erro no meu log log4j, nota que este erro não é causando uma exceção, só é visível nos logs;

DEBUG org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:256) - Data binding errors: 1

Isso acontece independentemente de murchar I desmarcar itens dentro da caixa de seleção, o formulário inteiro se recusa a submeter corretamente. Alguém pode me ajudar?

Estou ciente Como faço para ligar coleção atributos a um formulário no Spring MVC , que é semelhante a esta pergunta, infelizmente, nenhuma das sugestões parecia útil para o meu problema.

Foi útil?

Solução

O problema é com a apresentação de seu formulário. Primavera não é capaz de se ligar um objeto do comando, para que ele não enviar o formulário, mas redireciona para a formview vez.

Quando a ligação é realizada com sucesso, você verá esta mensagem em vez disso:

No errors -> processing submit

Para resolver o problema, você precisa registrar um CustomCollectionEditor com seu controlador. (Veja esta ligação ). Seria algo como isto:

protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception
{   
  binder.registerCustomEditor(Set.class, "rules", new CustomCollectionEditor(Set.class)
  {
    protected Object convertElement(Object element)
    {
        String name = "";

        if (element instanceof String)
            name = (String) element;

        return name != null ? new Rule(name) : null;
    }
  });
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top