Spring MVC, um controlador de “add” e “update” ao usar setDisallowedFields?

StackOverflow https://stackoverflow.com/questions/826385

  •  05-07-2019
  •  | 
  •  

Pergunta

Então, eu tenho um formulário simples através do qual eu pode "adicionar" uma coisa nova, ou "update" um já existente Thing.

O que eu gostaria é ter um controlador que pode processar tanto a adição e atualização. No início isso parece bastante simples, até que eu considere o problema de usar setDisallowedFields na minha InitBinder para que o campo "id" não é permitido quando a adição de uma nova coisa.

Atualmente tenho dois controladores com o que poderia ser de código idênticos, exceto para o método InitBinder.

Todas as sugestões ou conselhos? (Estou aberto ao argumento de que eu deveria querer manter dois controladores também, se você pode me dar boas razões)

Foi útil?

Solução

Na verdade, você deve desabilitar o campo "id" tanto ao adicionar e atualização. Caso contrário, um utilizador mal intencionado poderia mexer com o valor do "id" parâmetro de solicitação de uma solicitação de atualização e, assim, atualizar um registro diferente ao mostrado pela forma (assumindo que não há nenhum ACLs ou outra garantia de nível de domínio).

No entanto, se você simplesmente não permitir o campo "id", o controlador irá tratar o ID como sendo nulo, o que irá trabalhar ao inserir, mas não quando a atualização (por exemplo, ele pode tentar inserir um novo registro em vez de atualização, dependendo do que persistência mecanismo que você está usando). Então você quer que o controlador de lembrar os valores não editáveis ??do seu objeto de domínio (e não apenas IDs, mas todos os campos proibido) entre as solicitações para que ele possa enviar todos os valores corretos para a camada de serviço ou outra lógica de negócios. Isso é feito usando a anotação @SessionAttributes de nível tipo, como segue (outras anotações omitidos para maior clareza):

@SessionAttributes("thing") // the name of your domain object in the model
public class ThingController {

    public void setDisallowedFields(WebDataBinder binder) {
        binder.setDisallowedFields("id", "someOtherUneditableField");
    }

    // request handling methods go here as before
}

Para uma maior segurança, defina os campos permitidos em vez de campos não permitidos. De qualquer maneira que você precisa a anotação @SessionAttributes para preencher quaisquer que sejam os valores dos campos existentes são ignoradas a partir da solicitação.

Outras dicas

O método assinatura para initBinder leva na HttpServletRequest:

protected void initBinder(HttpServletRequest request, 
    ServletRequestDataBinder binder)

Por isso, talvez você pode ter initBinder() verificar os parâmetros de solicitação para determinar se você deve condicionalmente conjunto setDisallowedFields?

(Se isso não ajuda, talvez eu não estou entendendo o problema corretamente ...)

A forma como eu fazer isso com um único controlador é ter um boolean no meu objeto de comando indicando se é um novo objeto ou não. Em onSubmit Posso, então, verificar o boolean para ver se eu preciso executar uma ação adicionar ou atualizar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top