Trasladar la funcionalidad de un managed bean mientras que la migración del Núcleo de JSF para la Costura

StackOverflow https://stackoverflow.com/questions/7822773

Pregunta

He utilizado para inicializar ciertas propiedades de un objeto de entidad, con valores predefinidos tan pronto como su instanciación en un @PostConstruct método de jsf managed bean (o incluso el managed bean constructor).No puedo conservar esta funcionalidad al trasladar el proyecto a la Costura con el managed bean ido (pregunto también cómo sería en JSF 2.2 sin managed beans).

La clase de entidad:

@Entity
@Name("task") // this line in Seam version
public class Task implements Serializable {

    private Integer id;
    private String subject;
    private Date creationDate;
    private Date completionDate;
    private Category category;
    private User user;

    public Task() {
    }

    public Task(Date creationDate) {
        this.creationDate = creationDate;
        this.user = user;
    }

    // getters & setters, etc.
}

El JSF Managed Bean

public class TaskBean extends BaseBean {

    // Super class provides the logged in user object and a default category object

    private Task task = new Task(java.util.Calendar.getInstance().getTime(), this.user);

    @PostConstruct
    public void initTaskBean() {
        if (certainConditionMet) 
            task.setCategory(defaultCategory);
    }

    // Other managed bean business...
}

La página JSF

<h:form>
<h:panelGrid columns="2">
    Date: <h:outputText value="#{taskBean.task.creationDate}">
            <f:convertDateTime pattern="dd/MM/yyyy" />
           </h:outputText>
    User:  <h:outputText value="#{taskBean.task.user.name}" />
    Subject: <h:inputText value="#{taskBean.task.subject}" id="subjectField" />
    Category: <h:selectOneMenu value="#{taskBean.task.category}" id="catMenu">
                <f:selectItems value="#{taskBean.categories}" />
              </h:selectOneMenu>
    // remaining stuff
</h:panelGrid>
</h:form>

El Bean de Sesión sin estado en la Costura de la versión asumiendo también la responsabilidad de la jsf managed bean

@Name("taskAction")
@Stateless
public class TaskAction implements TaskActionLocal {

    @PersistenceContext
    private EntityManager em;

    @In private FacesMessages facesMessages;
    @In User user;
    @In Category defaultCategory
    @Logger private Log log;

    @In
    // private Task task = new Task(java.util.Calendar.getInstance().getTime(), user)
    // the above didn't work so 
    private Task task; 

    @PostConstruct
    public void baslarken() {
        System.out.println("TaskAction PostConstructed");
        task = new task(java.util.Calendar.getInstance().getTime(), user);
        if (certainConditionMet) 
                task.setCategory(defaultCategory);

        // the above won't work either. Date and User always blank on the ui form
    }

    // other business methods, etc
}

De la costura de la versión del formulario:

<h:form id="todo" styleClass="edit">
    <rich:panel>
        <f:facet name="header">Task To Do</f:facet>

        <s:decorate id="dateField" template="layout/edit.xhtml">
            <ui:define name="label">Date:</ui:define>
            <h:outputText value="#{task.creationDate}"/>
        </s:decorate>

        <s:decorate id="userField" template="layout/edit.xhtml">
            <ui:define name="label">User:</ui:define>
            <h:outputText value="#{task.user.name}"/>
        </s:decorate>

        <s:decorate id="subjectField" template="layout/edit.xhtml">
            <ui:define name="label">Başlık</ui:define>
            <h:inputText id="subject" required="true" value="#{task.subject}" >
            <a4j:support event="onblur" reRender="subjectField" bypassupdates="true" ajaxSingle="true" />
            </h:inputText>
        </s:decorate>

        <!-- other components, etc -->
    </rich:panel>
</h:form>

Necesito consejos sobre cómo hacer la tarea objeto de mantener la fecha y la registra en los datos de usuario (y, preferiblemente, una categoría por defecto) pre-pobladas cuando se crea una instancia.

¿Fue útil?

Solución

Primer im lo siento, pero no puedo encontrar un enlace comentario sobre esta respuesta??( así que los moderadores se sienten libres para moverse en este post;) )

La ampliación de la entityhome clase como un bean de sesión debe ser posible que sí.Pero si es la cosa correcta a hacer, no estoy seguro.Yo sería más probable que cree un nuevo bean de sesión que sirve mi propósito más exacta.

Para la fábrica de la invocación.Ustedes lo llaman de la misma manera a partir de una página jsf como cualquier otro nombre.I. e.value="#{createNewTask.id}".O se puede inyectar en otra clase.Echa un vistazo a la costura doc.Su muy bien escrito.

Otros consejos

Tiene varias posibilidades para inicializar una entidad.No es la EntityHome clase que se puede extender de una entidad.Se trata de la implementación predeterminada de la manipulación de las entidades para un editor.También se utiliza si utiliza seam-gen para crear su aplicación.

Esto sería algo como esto:

@Name("queryHome")
@Scope(ScopeType.CONVERSATION)
public class QueryHome extends EntityHome<Query> {
    /*
     * (non-Javadoc)
     * @see org.jboss.seam.framework.Home#createInstance()
     */
    @Override
    public Query createInstance() {
        Query query = super.createInstance();
        query.setUser(loggedUser);
        query.setCreationDate(new Date());
        query.setLastExecutionDate(new Date());
        return query;
    }
}

Y que va a llamar queryHome.getInstance().Si el id de la propiedad en entityHome se establece intentará cargar la entidad con este id de la base de datos, y si no hay ningún id llamar a createInstance().Así es como yo lo uso normalmente.

También puede crear una fábrica anotado método en una costura managed bean.No puedes hacer lo que te gusta.

@Name("CreationFactory")
@Scope(ScopeType.STATELESS)
pulic class CreationFactory {

    @Factory("createNewTask")
    public Task createTask() {
        Task task = new Task();
        task.sometext = "sometext";
        return task;
    }
}

Yo normalmente no acceder o crear un bean directamente, pero yo uso un gestor de componente, como el entityhome para hacerlo.Usted puede simplificar el acceso con una fábrica, pero esto se explica en la Costura de la documentación.

Martin

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top