关于Seam上下文范围的问题

时间:2009-09-10 20:19:56

标签: java jsf jpa jboss seam

我对我的接缝组件的不同范围使用角色存在疑问。例如:

我的项目有一个名为Parameter的表,它将项目的所有全局参数存储为URL,管理电子邮件等...对于此表,有一个简单的CRUD接口用于管理。

所以,阅读seam 2.1.2文档我不认为我应该有一个带有Application范围的seam组件,因为参数将适用于所有项目和另一个范围,对于CRUD管理,一个Event范围。

1)这是正确的吗? 2)范围必须在EntityBean或SessionBean上定义

代码:

会话Bean ParameterSB

@Scope(ScopeType.APPLICATION)
@Name("parametroSB")
public class ParametroSB implements java.io.Serializable{

   private static final long serialVersionUID = 1L;

   @DataModel
   private List<Parametro> lstParametro;

   @In (required=false)
   @Out
   @DataModelSelection
   private Parametro parametro;

   @In
   private EntityManager entityManager;

   @In
   private Events events;

   @Logger
   private static Log log;

   @SuppressWarnings("unchecked")
   @Factory("lstParametro")
   @Observer("recarregaListaParametro")
   public List<Parametro> getLstParametro() {

       StringBuilder strHQLBuilder = new StringBuilder("select p from Parametro p where 1=1 ");
       strHQLBuilder.append((parametro.getNome() != null && !parametro.getNome().equals("")) ?  "and p.nome=#{parametro.nome} " : "");
       strHQLBuilder.append((parametro.getValor() != null && !parametro.getValor().equals("")) ? "and p.valor=#{parametro.valor} " : "");
       strHQLBuilder.append((parametro.getPais() != null && parametro.getPais().getId() > 0) ? "and p.pais.id=#{parametro.pais.id} " : "");

       lstParametro = (List<Parametro>) entityManager.createQuery(strHQLBuilder.toString()).getResultList();

       if (lstParametro.size() == 0 ){
           FacesMessages.instance().add("Nenhum registro encontrado");
       }
       return lstParametro;
   }

   public void setLstParametro(List<Parametro> lstParametro) {
      this.lstParametro = lstParametro;
   }

   @SuppressWarnings("unchecked")
   public void delete(){

       try{
           if (parametro != null && parametro.getId() > 0){

               //busca o objeto no banco. Necessario para fazer a exclusão
               parametro = entityManager.find(Parametro.class, parametro.getId());

               //exclui o objeto do banco
               entityManager.remove(parametro);

               //limpa o DataModelSelection
               parametro = new Parametro();

               //informa mensagem de sucesso
               FacesMessages.instance().addFromResourceBundle("prepark.parametro.exclusao.sucesso");

               //chama um evento para atualizar a lista
               //events.raiseTransactionSuccessEvent("recarregaListaParametro"); 
           }

       }catch(Exception e){
           FacesMessages.instance().add("Foi encontrado um erro na aplicação. Entre em contato com o Administrador");
       }
   }

   /**
    * @author : Cateno Viglio
    * Método responsavel por fazer a persistencia no banco para uma inclusão e alteração.
    * Caso o objeto Parametro não possua id, será feito um insert no banco.
    */
   public void insert(){

       Boolean blInsert = null;

       try{

           //verifica se esta sendo feito um insert ou update na base
           blInsert = (parametro == null) ? null : ((parametro.getId() > 0) ? Boolean.FALSE : Boolean.TRUE ); 

           if (blInsert != null){

               //executa o insert ou update
               entityManager.merge(parametro);

               //limpa o DataModelSelection
               parametro = new Parametro();

               if (blInsert){
                   FacesMessages.instance().addFromResourceBundle("prepark.parametro.inclusao.sucesso"); 
                   events.raiseTransactionSuccessEvent("recarregaListaParametro"); //chama um evento para atualizar a lista
               }else{
                   FacesMessages.instance().addFromResourceBundle("prepark.parametro.alteracao.sucesso"); //informa mensagem de sucesso
               }
           }

       }catch(Exception e){
           FacesMessages.instance().add("Foi encontrado um erro na aplicação. Entre em contato com o Administrador");
       }
   }

   /**
    * @author : Cateno Viglio
    * Metodo responsavel por fazer a chamada a pagina de alteração.
    */
   public void select(){}

}

实体Bean参数

@Scope(ScopeType.APPLICATION)
@Name("parametro")
@Table(name="parametro")
@Entity
public class Parametro implements java.io.Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    private int id;

    @NotNull @Length(min=5, max=45)
    @Column(name="NM_PARAMETRO")
    private String nome;

    @NotNull @Length(min=5, max=255)
    private String valor;

    @ManyToOne
    @JoinColumn(name="FK_PAIS")
    private Pais pais = new Pais();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getValor() {
        return valor;
    }

    public void setValor(String valor) {
        this.valor = valor;
    }

    public Pais getPais() {
        return pais;
    }

    public void setPais(Pais pais) {
        this.pais = pais;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Parametro other = (Parametro) obj;
        if (id != other.id)
            return false;
        return true;
    }


}

1 个答案:

答案 0 :(得分:2)

1)这是正确的。如果这是整个应用程序的全局数据,请使用应用程序范围。

2)您不需要将范围放在实体Bean中。由于您是从应用程序作用域SFSB进行注入和注入,因此它将自动从应用程序范围中注入/注出。

但是你必须以某种方式创建初始实例(或许使用Factory)。