Como faço para escrever um conversor personalizado no Spring Web Flow 2?
-
13-09-2019 - |
Pergunta
Eu estou usando Web Flow 2.0.7 com Spring MVC e Hibernate.
O meu problema é sobre conversores personalizados para os meus tipos personalizados e conexão com o banco de dentro do meu conversor.
Vamos dizer que eu tenho um tipo Person e Person tem um campo do meu tipo personalizado Título , e todos os Títulos já estão no meu banco de dados. Agora eu tenho um formulário HTML, em que um usuário pode preencher um Person instância, incluindo a seleção do Título em um select drop-down box.
Na definição fluxo eu recebo todos os Títulos do banco de dados e eles são mostrados na caixa suspensa usando um conversor personalizado, convertendo Título e Cadeia e mais tarde de volta para Título .
A minha pergunta é sobre o processo de conversão de volta de string (que é o ID do banco de dados, o que eu defini como o valor no elemento) para o correto Título objeto de meu banco de dados. Basicamente:? Como fazê-lo
Até agora, eu era incapaz de obter uma titleManager injetado em meu conversor para ter acesso ao banco de dados. Este cenário foi comentado no Spring Web Flow Fórum . Outra solução poderia ser a de armazenar em cache os Títulos antes de renderizar a vista e de alguma forma obter o in-memory Título após o formulário foi publicado.
Eu realmente aprecio isso, se alguém poderia me esclarecer, como lidar com este tipo de ligação de dados. Eu era incapaz de fazê-lo funcionar tão longe e, portanto, eu recebo o uso mínimo fora das webflows de outra forma impressionante.
Eu já postou uma discussão sobre o Fluxo Board Web, mas ainda faltando um best-pratice, que eu sou incapaz de encontrar por mim mesmo.
Muito obrigado!
Wolfram
Solução
Eu uso para fazer isso. Basicamente eu carregar a lista de títulos e colocá-lo no meu modelo de formulário. No modelo de formulário Eu também tenho uma variável currentTitleId ou selectedTitleId para armazenar o valor do item selecionado. Este nome de campo está situado no "caminho" do combobox primavera eo TitleList é definido nos "itens". Em seguida, o valor que você deseja vincular está situado no "ItemValue" e o texto a ser mostrado para esse valor em "itemLabel". É isso.
No meu modelo de formulário:
private int currentTitleId;
public long getCurrentTitleId() { return this.currentTitleId; }
public void setCurrentTitleId(long currentTitleId) { this.currentTitleId = currentTitleId; }
List titleList = getTitlesFromMyDatabaseHereOrSomewhereElse();
Na minha jsp:
<form:label path="currentTitleId">Title</form:label>
<form:select path="currentTitleId" items="${formModel.titleList}" itemLabel="titleDescription" itemValue="titleId" />
Eu assumo que sua classe título será algo como isto:
class Title {
public long getTitleId() { return this.titleId; }
public long getTitleDescription() { return this.titleDescription; }
}
Você também pode personalizar você combobox um pouco mais parecido com isto:
<form:select path="currentPhoneNumberId">
<form:option value="">-</form:option>
<c:forEach items="${formModel.phoneList}" var="phone">
<form:option value="${phone.phoneNumberId}">${phone.phoneNumberId} - ${phone.description}</form:option>
</c:forEach>
</form:select>
Outras dicas
Eu não estou tão certo sobre Spring Web Flow, mas com o Spring MVC normal, é suficiente para registrar um novo PropertyEditor e, em seguida, essa coisa funciona automaticamente
Assim, gostaria de criar um novo PropertyEditor que recebe um serviço ou dao que seria responsável por obter os dados do banco de dados, e dentro do PropertyEditor você converter o ID para o seu tipo de chave e obter o valor a partir do banco de dados e de retorno isto. Eu só não tenho um exemplo bem comigo, mas espero que você começa a essência.