Enum + Struts 2.1 (tag s:select) + Hibernate

Como achei muitos tópicos fragmentados e dúvidas sobre o assunto, resolvi postar a solução que encontrei para utilização de Campos Enum com Hibernate e Struts 2 com a tag s:select. Pelo que pesquisei, essa solução só funciona com struts 2.1.X.X no 2.0 precisa usar o EnumTypeConverter.

Gostaria da opinião de todos se foi boa a solução adotada, ou se existe uma forma melhor.

Quando defini os campos do enum como PEQUENO(“0”,“Pequeno”), PEQUENO(0) ou apenas PEQUENO, por exemplo, dá erro de conversão no Struts, mais especificamente no xwork, e pelo que vi o suporte default ao Enum do struts 2.1, funciona apenas quando não alteramos o campo listKey da tag s:select. Assim o do select gerado fica igual ao valor do Enum. A solução talvez seja criar um outro TypeConverter.

Segue o código:

  1. Definição do Enum:
public enum Porte {
	P("Pequeno"),
	M("Médio"),
	G("Grande");

	private String nome;   /* Utilizado apenas para listValue da tag s:select */

	private Porte(String nome) {
		this.nome = nome;
	}
	public String getNome() {
		return nome;
	}
	
}
  1. Utilização do enum na Entity (Quando utilizei o EnumType.ORDINAL, ele grava valor numérico no banco mas deu erro na recuperação dos dados no Hibernate)
	@Column(name = "porte", nullable = true)  
	@Enumerated(EnumType.STRING)  
	public Porte getPorte() {
		return porte;
	}
	public void setPorte(Porte porte) {
		this.porte = porte;
	}
  1. Declaração do array no Action
private Porte[] porteArray = Porte.values(); /* Já preenche o Array com os valores do Enum sem precisar de um for */

	public Porte[] getPorteArray() {
		return porteArray;
	}

	public void setPortearray(Porte[] porteArray ) {
		this.porteArray = porteArray ;
	}
  1. No JSP a tag s:select fica assim:
	<s:select label="Porte" name="porte" list="porteArray" listValue="nome" cssClass="txt-informativo" />	
  1. Como resultado o código HTML gerado do select fica:
<select name="porte" id="cliente-save_porte" class="txt-informativo">
    <option value="P">Pequeno</option>
    <option value="M">Médio</option>
    <option value="G">Grande</option>
</select>

E o resultado que será gravado no banco será “P”, “M” ou “G”, podendo ser utilizado um campo VARCHAR(1).

Abraços,
Luis Campello

Apenas uma correção, quando definimos o Enum como:

public enum Porte {
	PEQUENO,
	MEDIO,
	GRANDE;
}

não dá erro de conversão no Struts, mas o select gerado fica

<select name="porte" id="cliente-save_porte" class="txt-informativo">
    <option value="PEQUENO">PEQUENO</option>
    <option value="MEDIO">MEDIO</option>
    <option value="GRANDE">GRANDE</option>
</select>

e o valor gravado no banco fica o próprio valor do Enum.

[]'s
Luis

Excelente Dica !!!

Me ajudou bastante !!

Obrigado @!