Jsf 2 Jsf自定义转换器生命周期

Jsf 2 Jsf自定义转换器生命周期,jsf-2,converter,Jsf 2,Converter,在这个网站上,我意识到我对定制转换器的生命周期一无所知。我在网上搜索了一下,没发现什么有用的东西 我想了解定制转换器是否一次性创建并在需要时随时回收,或者是否在运行中创建并销毁 我认为它们的主要目的是执行一些简单而轻松的任务,因此,如果每次在发送给用户的jsf页面中找到转换器的新实例时都创建了它,则不会有什么区别 但是我想用一个自定义转换器来解决一个普通的任务,它是一种未铺砌的方式。我的自定义转换将有一个沉重的初始化逻辑,所以我必须确定它的生命周期。它必须一次性创建,而不是每次需要时都创建。可能

在这个网站上,我意识到我对定制转换器的生命周期一无所知。我在网上搜索了一下,没发现什么有用的东西

我想了解定制转换器是否一次性创建并在需要时随时回收,或者是否在运行中创建并销毁

我认为它们的主要目的是执行一些简单而轻松的任务,因此,如果每次在发送给用户的jsf页面中找到转换器的新实例时都创建了它,则不会有什么区别

但是我想用一个自定义转换器来解决一个普通的任务,它是一种未铺砌的方式。我的自定义转换将有一个沉重的初始化逻辑,所以我必须确定它的生命周期。它必须一次性创建,而不是每次需要时都创建。可能吗


根据我将收到的答案,我可以放弃使用自定义转换器的想法,或者决定以单音形式移动繁重的初始化逻辑

使用注释时,每次引用转换器时,都会创建一次转换器。这意味着如果你在那里执行慢代码,它会给你带来问题

或者,您可以使用所需的作用域将其注释为
@ManagedBean
,并将其与原始转换器id一起使用。如果您希望以某种方式对其进行初始化,您的解决方案是将其设置为整个应用程序的作用域,并使其急切地进行初始化,因此,它们将在应用程序启动时创建:

转换器:

@ManagedBean(eager = true)
@ApplicationScoped
public class WorkerConverter implements Converter {

    public WorkerConverter() {
        System.out.println("Building converter...");
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        Integer id = Integer.parseInt(value);
        if (id == 1) {
            return new Worker(1, "John");
        } else {
            return new Worker(1, "Larry");
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        return ((Worker) value).getId().toString();
    }

}
@ManagedBean
@ViewScoped
public class SelectWorkerBean {

    public static class Worker {
        Integer id;
        String name;

        public Worker(Integer id, String name) {
            this.id = id;
            this.name = name;
        }

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

        public Integer getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        @Override
        public int hashCode() {
            return id;
        }

        @Override
        public String toString() {
            return "Worker [name=" + name + "]";
        }

    }

    private Worker selectedWorker;

    private List<Worker> workers = Arrays.asList(new Worker(1, "John"),
            new Worker(2, "Larry"));

    public Worker getSelectedWorker() {
        return selectedWorker;
    }

    public List<Worker> getWorkers() {
        return workers;
    }

    public void send() {
        System.out.println(selectedWorker + " selected");
    }

    public void setSelectedWorker(Worker selectedWorker) {
        this.selectedWorker = selectedWorker;
    }

}
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Test page</title>
</h:head>
<h:body>
    <h:form>
        <h:selectOneMenu value="#{selectWorkerBean.selectedWorker}"
            converter="#{workerConverter}">
            <f:selectItems value="#{selectWorkerBean.workers}" var="worker"
                itemLabel="#{worker.name}" />
        </h:selectOneMenu>
        <h:commandButton value="send" action="#{selectWorkerBean.send}" />
    </h:form>
</h:body>
</html>
托管bean:

@ManagedBean(eager = true)
@ApplicationScoped
public class WorkerConverter implements Converter {

    public WorkerConverter() {
        System.out.println("Building converter...");
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        Integer id = Integer.parseInt(value);
        if (id == 1) {
            return new Worker(1, "John");
        } else {
            return new Worker(1, "Larry");
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        return ((Worker) value).getId().toString();
    }

}
@ManagedBean
@ViewScoped
public class SelectWorkerBean {

    public static class Worker {
        Integer id;
        String name;

        public Worker(Integer id, String name) {
            this.id = id;
            this.name = name;
        }

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

        public Integer getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        @Override
        public int hashCode() {
            return id;
        }

        @Override
        public String toString() {
            return "Worker [name=" + name + "]";
        }

    }

    private Worker selectedWorker;

    private List<Worker> workers = Arrays.asList(new Worker(1, "John"),
            new Worker(2, "Larry"));

    public Worker getSelectedWorker() {
        return selectedWorker;
    }

    public List<Worker> getWorkers() {
        return workers;
    }

    public void send() {
        System.out.println(selectedWorker + " selected");
    }

    public void setSelectedWorker(Worker selectedWorker) {
        this.selectedWorker = selectedWorker;
    }

}
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Test page</title>
</h:head>
<h:body>
    <h:form>
        <h:selectOneMenu value="#{selectWorkerBean.selectedWorker}"
            converter="#{workerConverter}">
            <f:selectItems value="#{selectWorkerBean.workers}" var="worker"
                itemLabel="#{worker.name}" />
        </h:selectOneMenu>
        <h:commandButton value="send" action="#{selectWorkerBean.send}" />
    </h:form>
</h:body>
</html>
@ManagedBean
@视域
公共类SelectWorkerBean{
公共静态类工作者{
整数id;
字符串名;
公共工作者(整数id、字符串名称){
this.id=id;
this.name=名称;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
工人其他=(工人)obj;
if(id==null){
if(other.id!=null)
返回false;
}如果(!id.equals(other.id))
返回false;
返回true;
}
公共整数getId(){
返回id;
}
公共字符串getName(){
返回名称;
}
@凌驾
公共int hashCode(){
返回id;
}
@凌驾
公共字符串toString(){
返回“Worker[name=“+name+”]”;
}
}
私人工人选择工人;
private List workers=Arrays.asList(新Worker(1,“John”),
新工人(2名,“拉里”);
公共工作者getSelectedWorker(){
返回所选工人;
}
公共列表getWorkers(){
返乡工人;
}
公共无效发送(){
System.out.println(selectedWorker+“selected”);
}
public void setSelectedWorker(Worker selectedWorker){
this.selectedWorker=selectedWorker;
}
}
页面:

@ManagedBean(eager = true)
@ApplicationScoped
public class WorkerConverter implements Converter {

    public WorkerConverter() {
        System.out.println("Building converter...");
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        Integer id = Integer.parseInt(value);
        if (id == 1) {
            return new Worker(1, "John");
        } else {
            return new Worker(1, "Larry");
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        return ((Worker) value).getId().toString();
    }

}
@ManagedBean
@ViewScoped
public class SelectWorkerBean {

    public static class Worker {
        Integer id;
        String name;

        public Worker(Integer id, String name) {
            this.id = id;
            this.name = name;
        }

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

        public Integer getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        @Override
        public int hashCode() {
            return id;
        }

        @Override
        public String toString() {
            return "Worker [name=" + name + "]";
        }

    }

    private Worker selectedWorker;

    private List<Worker> workers = Arrays.asList(new Worker(1, "John"),
            new Worker(2, "Larry"));

    public Worker getSelectedWorker() {
        return selectedWorker;
    }

    public List<Worker> getWorkers() {
        return workers;
    }

    public void send() {
        System.out.println(selectedWorker + " selected");
    }

    public void setSelectedWorker(Worker selectedWorker) {
        this.selectedWorker = selectedWorker;
    }

}
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Test page</title>
</h:head>
<h:body>
    <h:form>
        <h:selectOneMenu value="#{selectWorkerBean.selectedWorker}"
            converter="#{workerConverter}">
            <f:selectItems value="#{selectWorkerBean.workers}" var="worker"
                itemLabel="#{worker.name}" />
        </h:selectOneMenu>
        <h:commandButton value="send" action="#{selectWorkerBean.send}" />
    </h:form>
</h:body>
</html>

测试页