Портирование функциональности управляемого компонента при миграции с Core JSF на Seam - PullRequest
0 голосов
/ 19 октября 2011

Я использовал для инициализации определенных свойств объекта сущности с предопределенными значениями еще в момент его создания в методе @PostConstruct управляемого bean-компонента jsf (или даже конструктора управляемого bean-компонента).Я больше не могу сохранить эту функциональность при переносе проекта в Seam с исчезнувшим управляемым bean-компонентом (интересно также, как это было бы в JSF 2.2 без управляемых bean-компонентов).

Класс сущности:

@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.
}

Управляемый компонент JSF

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...
}

Страница 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>

The StatelessСессионный компонент в версии Seam, также принимая на себя ответственность за управляемый компонент jsf

@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
}

Версия формы шва:

<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>

Мне нужен совето том, как заставить объект задачи содержать дату и зарегистрированные пользовательские данные (и предпочтительно категорию по умолчанию), предварительно заполненные при создании экземпляра.

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Сначала извините, но я не могу найти ссылку на комментарий к этому ответу ?? (поэтому модераторы могут свободно перемещать этот пост;))

Расширение класса entityhome в качестве сессионного компонента должно быть возможным да. Но если это правильно, я не уверен. Я бы с большей вероятностью создал новый сессионный компонент, который более точно соответствует моим целям.

Для заводского вызова. Вы будете называть это так же со страницы jsf, как и любое другое имя. То есть значение = "# {createNewTask.id}". Или вы можете ввести его в другой класс. Посмотрите на документацию по шву. Это действительно хорошо написано.

1 голос
/ 21 октября 2011

У вас есть несколько возможностей для инициализации объекта.Существует класс EntityHome, который вы можете расширить для сущности.Это стандартная реализация обработки сущностей для редактора.Он также используется, если вы используете seam-gen для создания приложения.

Это будет выглядеть примерно так:

@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;
    }
}

И вы будете вызывать queryHome.getInstance ().Если свойство id в entityHome установлено, оно будет пытаться загрузить сущность с этим идентификатором из базы данных, а если нет идентификатора, она вызовет createInstance ().Вот как я использую это обычно.

Вы также можете создать аннотированный методом фабрики в bean-компоненте, управляемом швом.Там вы можете делать все, что захотите.

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

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

Обычно у меня нет прямого доступа к бобу или его создания, но я использую для этого компонент менеджера, такой как entityhome.Вы можете упростить доступ с помощью фабрики, но это объясняется в документации по Seam.

Martin

...