Вопрос по code-injection, postconstruct, jsf, managed-bean, design-patterns – Инъекция JSF с управляемым свойством, хороший шаблон?

2

я совсем новичок в JSF и не оченьиспользуемый" к другому мышлению, поэтому яЯ борюсь за то, что (я предполагаю) является основным.

Допустим, у меня есть класс User, который является сессионным компонентом.

Допустим, у меня есть контроллер из 10000 объектов, скажем, Factory, который должен быть в состоянии установить некоторые из них как "заблокирован»в нашем случае это означает, чтозаблокирован» поле больше не становится нулевым, но ссылается на "LockedItem» объект.

Вот где я могучтобы все заработало: LockedItem, когда вы его создаете, должен ссылаться на пользователя, который в данный момент вошел в систему. Как я должен это сделать?

Я попытался выполнить инъекцию с @managedproperty, но в LockedItem.constructor это значение равно нулю (что, как я полагаю, нормально), затем я попытался использовать метод @PostConstruct, но этот метод никогда не вызывается (почему? Даже если я сделаю его управляемым ... методы постконструкции вызываются только тогда, когда объект создается.xhtml» ?) Или я должен использовать "ява се " трюк, как сделать пользователя статичным?

Код для пояснения, почему не вызывается @PostConstruct (один из "сиденье»):

.xhtml



пользователь

package test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class User implements Serializable {
    private String name ;

    public User()
    {
        name = "toto"; 
        System.out.println("User constructor");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

Автомобиль

package test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class Car implements Serializable {
    private String brand ;
    private Seat seat ;

    public Car()
    {
        brand = "audi" ;
        seat = new Seat();
        System.out.println("Car constructor") ;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }


}

сиденье

package test;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean
public class Seat implements Serializable {
    private int nb ;
    private String userName ;

    @ManagedProperty("#{user}")
    private User user ;

    public Seat()
    {
        nb = 4 ;
        userName="na";
        System.out.println("! Seat constructor ") ;
    }

    @PostConstruct
    public void init()
    {
        System.out.println("!! Seat postconstruct : "+user.getName());
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public int getNb() {
        return nb;
    }

    public void setNb(int nb) {
        this.nb = nb;
    }
}

Спасибо !

Ваш Ответ

1   ответ
5

@PostConstruct это правильный путь.

Это'не вызывается, если вы сами создаете экземпляр компонентаnew оператор (очевидно). Это'вызывается только в том случае, если JSF создает экземпляр и управляет самим компонентом всякий раз, когда он 'ссылки в первый раз в контексте EL, как так#{bean}, Это действительно обычно происходит на стороне вида, но это также может происходить на стороне модели / контроллера@ManagedProperty("#{bean}") или же .Application#evaluateExpressionGet()

Вы не должны абсолютноUser статичный. Это будет общедоступным приложением, а не сессией.

Альтернативой является просто передать текущийUser в качестве аргумента конструктораLockedItemили для вызова метода инициализациисамнаверняка, если этот класс вообще не представляет легитимный компонент поддержки JSF.

Вы'Добро пожаловать BalusC
Спасибо BalusC! Я'Я попробовал все это в небольшом тестовом примере и все еще могукажется, получить PostConstruct класса ("сиденье») вызывается с помощью @ManagedProperty, вы случайно не знаете, чтов моем коде что-то не так (опубликовано как ответ)? (Обратите внимание, что это действительно называется, если у меня есть <h: outputLabel id = "сиденье» значение =»у вас # {seat.nb} " места />) Qualaelay
Большое спасибо ! Qualaelay
Вы должны иметь@ManagedProperty("#{seat}") вместо .new Seat() BalusC
По твоим решениям у меня еще есть "шаблон" вопрос на самом деле из-за абстрактного. В моем конкретном случае у меня естьLibraryObject который является абстрактным и определяет реализацию по умолчанию для блокировки объекта (то естьLockedItem).LockedItem должен знать, ктоUser (сессионный компонент), чтобы получить его имя. Изначально ниLibraryObject ниLockedItem бобы Лучший способ сделать это, кажется, сделатьLibraryObject управляемый компонент, на который я добавляюUser и, как вы сказали, создать новыйLockedItem даваяUser ссылка, но я могут его абстрактно ... Есть идеи? Qualaelay

Похожие вопросы