Pergunta

Eu estou trabalhando em um aplicativo Primavera com muitas formas de entrada. Eu gostaria de reutilizar o comprimento do campo nas anotações UI-formulário, validação e JPA. Existe uma maneira elegante de resolver isso. Minha solução no momento é, para usar constantes para declarar o comprimento:

public class Person
{
   public static final int FIRSTNAME_LENGTH = 25;

   @Column(length=FIRSTNAME_LENGTH)
   private String firstName;

   ...
}

e, em seguida, reutilizar a constante no validador e JSP

...

<form:input path="firstName" 
    maxlength="<%= Integer.toString(Person.FIRSTNAME_LENGTH) %>"/>

...

o que é bastante detalhado.

Existe alguma solução mais elegante para este problema?

Foi útil?

Solução

É bem possível acessar as informações armazenadas no anotações. Na verdade, este é o seu principal objetivo: armazenamento de informações meta em um / método / campo de classe. Aqui está um exemplo de como acessar o comprimento armazenado em uma anotação @Column:

import javax.persistence.Column;
import javax.persistence.Entity;

@Entity
public class Person {

   @Column(length=30)
   private String firstName;

   public static void main(String[] args) throws SecurityException, NoSuchFieldException {
      Object person = new Person();
      //find out length    
      System.out.println(person.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length());
   }
}

Você deve ser capaz de criar alguma tag personalizado ou feijão para extrair esta informação genérica.

Não é difícil criar suas próprias anotações. Você poderia considerar a criação de uma que especifica quais campos devem ser incluídos no formulário, como devem ser prestados, descrição, etc. que você poderia criar uma forma genérica. Em seguida, novamente você pode não gostar de misturar domínio e apresentação.

Outras dicas

Eu fiz uma pergunta semelhante quando eu estava usando Hibernate,

Obtendo comprimento da coluna de mapeamentos Hibernate?

Não faço ideia como para puxar esta informação sob JPA no entanto, mas se você estiver usando Hibernate como sua camada subjacente você pode tentar o acesso Hibernate diretamente e implementar a solução acima.

No entanto, a solução Hibernate é tão in-elegante como a solução que você delineado na sua resposta, com a desvantagem adicional que amarra sua implementação JPA para Hibernate.

A solução fornecida pelo EJB lê o valor anotada para comprimento da coluna. James McMahon apontam para que este expõe a implementação Hibernate. Isso pode ser resolvido de forma muito simples com métodos getter. Assumindo que não é uma interface para Pessoa com um getFirstNameLength método declarado:

import javax.persistence.Column;
import javax.persistence.Entity;

@Entity
public class PersonImplementation extends Person {

   @Column(length=30)
   private String firstName;

   public int getFirstNameLength() {
       return this.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length();
   }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top