【问题标题】:Converter to p:selectOneMenu error JSF with EJB使用 EJB 转换为 p:selectOneMenu 错误 JSF
【发布时间】:2014-12-10 04:09:17
【问题描述】:

我要转换的班级

@Entity
@Table(name = "mv_uf")
@SequenceGenerator(name = "sq_mv_uf", sequenceName = "sq_mv_uf", allocationSize = 1)
public class UF implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_mv_uf")
    @Column(name = "id")
    private Long id;

    @Column(name = "sigla_uf")
    private String siglaUF;

    @Column(name = "nome_uf")
    private String nomeUF;

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj == null) {
            return false;
        }

        if (getClass() != obj.getClass()) {
            return false;
        }

        UF other = (UF) obj;

        if (id == null) {
            if (other.id != null) {
                return false;
            }
        } else if (!id.equals(other.id)) {
            return false;
        }

        return true;
    }
    //get and set
}

我的转换器

@FacesConverter(value = "ufConverter", forClass = UF.class)
public class UFConverter implements Converter {

    @EJB
    private UF uf;
    private MapaEleitoralBeanLocal mapaEleitoralBean;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {

        if (value != null && !value.isEmpty()) {
            if (!isLong(value)) {
                return "";
            }

            Long id = Long.parseLong(value);
            uf = (UF) mapaEleitoralBean.consultarPorChavePrimaria(uf, id);
            return uf;

        } else {
            return null;
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value != null && !"".equals(value)) {
            uf = (UF) value;
            return String.valueOf(uf.getId());
        }
        return "";
    }

    private boolean isLong(String valor) {
        try {
            long i = Long.parseLong(valor);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

我的豆子

@Stateless
public class MapaEleitoralBean extends GenericDao implements MapaEleitoralBeanLocal {

    @Override
    public List<UF> listarTodosOsEstados() {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT o FROM ").append(UF.class.getSimpleName()).append(" o ");
        sql.append(" order by o.nomeUF");

        List<UF> listaDeTodosOsUF = new ArrayList<UF>();
        listaDeTodosOsUF = (List<UF>) consultarPorQuery(sql.toString(), 0, 0);

        if (listaDeTodosOsUF == null || listaDeTodosOsUF.isEmpty()) {
            return null;
        }

        return listaDeTodosOsUF;
    }

    @Override
    public List<Municipio> listarMunicipiosPorUF(UF uf) {

        StringBuilder sql = new StringBuilder();
        sql.append("SELECT o FROM ").append(Municipio.class.getSimpleName()).append(" o ");
        sql.append("WHERE o.siglaUF = '").append(uf.getSiglaUF()).append("' order by o.nomeMunicipio");

        List<Municipio> listaDeMunicipiosPorUF = new ArrayList<Municipio>();
        listaDeMunicipiosPorUF = (List<Municipio>) consultarPorQuery(sql.toString(), 0, 0);

        if (listaDeMunicipiosPorUF == null || listaDeMunicipiosPorUF.isEmpty()) {

            return null;
        }

        return listaDeMunicipiosPorUF;
    }
}

我的托管豆

@ManagedBean(name = "mapaEleitoralControl")
@ViewScoped
public class MapaEleitoralControl {

    private static final long serialVersionUID = 1L;

    @EJB
    private MapaEleitoralBeanLocal mapaEleitoralBean;
    private List<UF> listaUF;
    private UF uf;

    public MapaEleitoralControl() {
        super();
    }

    @PostConstruct
    public void init() {
        listaUF = new ArrayList<UF>();
        listaUF = mapaEleitoralBean.listarTodosOsEstados();
        //mapaEleitoralBean.listarMunicipiosPorUF(uf);
        System.out.println("pare");

    }

    public void handleToggle(ToggleEvent event) {
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Toggled", "Visibility:" + event.getVisibility());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
    //get and sets
}

我的 xhtml

<p:column>
    <p:selectOneMenu id="selectUF"
                     style="width:195px"
                     value="#{mapaEleitoralControl.uf}"
                     converter="ufConverter" >

        <f:selectItem itemLabel="Selecione a UF
                      " itemValue=""
                      noSelectionOption="true" />

        <f:selectItem value="#{mapaEleitoralControl.listaUF}"
                      var="uf"
                      itemLabel="#{uf.nomeUF}"
                      itemValue="#{uf}" />
    </p:selectOneMenu>
</p:column>

我对 JSF、PrimeFaces、EJB 和其他东西有点陌生,我遇到了这个错误,我不知道为什么。我已经环顾 Google 和这里​​,但找不到解决方案。

00:47:57,662 WARN  [org.jboss.modules] (MSC service thread 1-6) Failed to define class br.com.maxvoto.converter.EntityConverter in Module "deployment.maxvoto-ear.ear.maxvoto-ejb.jar:main" from Service Module Loader: java.lang.LinkageError: Failed to link br/com/maxvoto/converter/EntityConverter (Module "deployment.maxvoto-ear.ear.maxvoto-ejb.jar:main" from Service Module Loader)
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:487) [jboss-modules.jar:1.3.3.Final-redhat-1]
    at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:277) [jboss-modules.jar:1.3.3.Final-redhat-1]
    at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:92) [jboss-modules.jar:1.3.3.Final-redhat-1]
    at org.jboss.modules.Module.load

ModuleClass(Module.java:568) [jboss-modules.jar:1.3.3.Final-redhat-1]
....

【问题讨论】:

标签: jsf primefaces ejb


【解决方案1】:

你不应该使用 @EJB 注释。注入仅适用于托管 bean。使用InitialContext 获取目标组件。或者,将您的转换器设为可以注入 EJB 的 bean

@ManagedBean
@RequestScoped
public class UFConverter implements Converter {
    @EJB
    private UF uf;
    // ...
}

JSF 允许容器在 JSF 应用程序可以访问之前将容器托管资源的引用注入到托管 bean 实例中。只有声明在请求、会话或应用程序范围内的 bean 才有资格进行资源注入。

另见:How to inject @EJB, @PersistenceContext, @Inject, @Autowired, etc in @FacesConverter?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2012-08-01
    • 1970-01-01
    • 2012-04-20
    • 2014-03-19
    相关资源
    最近更新 更多