为什么@PostConstruct导致我的变量在JSF中为Null?

时间:2014-05-07 05:00:54

标签: java jsf model-view-controller null

首次加载JSF页面时,我正在生成一个List。这是一个@PostConstruct方法。 但是,它导致我的“FilmResultBean”中的变量“Title”为空,我不明白为什么。

相关守则:

DataTableBean:

@Component
@ManagedBean(name= DataTableBean.BEAN_NAME)
@Scope("request")
public class DataTableBean implements Serializable {
public static final String BEAN_NAME = "dataTableBean";

public static Logger logger = Logger.getLogger(DataTableBean.class);


@Autowired
@ManagedProperty(value = "filmResultBean")
FilmResultBean resultBean;


@Autowired
FilmBo filmBo;

private List<FilmResultBean> filmList;
private List<String> categoryList;
private String categoryName;
private String titleInput;




/* Default Constructor */
public DataTableBean() {

}

/*Queries the Database for a list of Film Objects and returns the films in
 * a list of type "FilmResultBean"
 */


@PostConstruct
public void init(){
    filmList = filmBo.generateFilmList(resultBean);
}



public void searchByBoth(){
    filmList = filmBo.searchByBoth(resultBean);
    logger.info("FilmList Inside SEARCHBYBOTH: " + filmList);
}


public String getTitleInput() {
    return titleInput;
}

public void setTitleInput(String titleInput) {
    this.titleInput = titleInput;
}

public List<String> getCategoryList() {
    return categoryList;
}

public void setCategoryList(List<String> categoryList) {
    this.categoryList = categoryList;
}

public String getCategoryName() {
    return categoryName;
}

public void setCategoryName(String categoryName) {
    this.categoryName = categoryName;
}




public void searchFilms(){

}
public List<FilmResultBean> getFilmList() {
    return filmList;
}
public void setFilmList(List<FilmResultBean> filmList) {
    this.filmList = filmList;
}
}

JSF页面:(该值是Null,只有当我使用@PostConstruct时才会返回)

<ace:textEntry value="#{filmResultBean.title}">
            <ace:ajax listener="#{dataTableBean.searchByBoth}"   execute="@this" render="form"  />
        </ace:textEntry>

@PostConstruct调用特定方法:

@Override
public List<FilmResultBean> generateFilmList(FilmResultBean films) {
    Session session = getCurrentSession();
    List<FilmResultBean> filmList;
    Film film = new Film();

    Query query = null;
    films.setTitle(film.getTitle());
    films.setRating(film.getRating());
    films.setRentalRate(film.getRentalRate());
    String hql;

    hql = "from Film";

    query = session.createQuery(hql);
    logger.info("Query: " + query);

    filmList = (query.list());

    return filmList;
}

FilmResultBean:

@Component
@ManagedBean
@SessionScoped
@Scope("session")
public class FilmResultBean implements Serializable {

BigDecimal rentalRate;
Short length;
String rating;
String title;
String category;

public FilmResultBean() {

}

public FilmResultBean(BigDecimal rentalRate, Short length, String rating,
        String title, String category) {

    this.rentalRate = rentalRate;
    this.length = length;
    this.rating = rating;
    this.title = title;
    this.category = category;
}

public BigDecimal getRentalRate() {
    return rentalRate;
}

public void setRentalRate(BigDecimal rentalRate) {
    this.rentalRate = rentalRate;
}

public Short getLength() {
    return length;
}

public void setLength(Short length) {
    this.length = length;
}

public String getRating() {
    return rating;
}

public void setRating(String rating) {
    this.rating = rating;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getCategory() {
    return category;
}

public void setCategory(String category) {
    this.category = category;
}

@Override
public String toString() {
    return title;
}
}

记录器信息:

23:51:41,013  INFO om.cooksys.training.dao.impl.FilmDaoImpl:  82 - Title: null
23:51:41,013  INFO om.cooksys.training.dao.impl.FilmDaoImpl:  83 - Category: null
23:51:41,038  INFO om.cooksys.training.dao.impl.FilmDaoImpl:  92 - Query:   QueryImpl(select new com.cooksys.training.FilmResultBean(fc.film.rentalRate,  fc.film.length, fc.film.rating, fc.film.title, fc.category.name) from Film f join f.filmCategories fc where f.title like :title)
Hibernate: 
select
    film2_.rental_rate as col_0_0_,
    film2_.length as col_1_0_,
    film2_.rating as col_2_0_,
    film2_.title as col_3_0_,
    category6_.name as col_4_0_ 
from
    sakila.film film0_ 
inner join
    sakila.film_category filmcatego1_ 
        on film0_.film_id=filmcatego1_.film_id,
    sakila.film film2_,
    sakila.category category6_ 
where
    filmcatego1_.film_id=film2_.film_id 
    and filmcatego1_.category_id=category6_.category_id 
    and (
        film0_.title like ?
    )
23:51:41,045  INFO       com.cooksys.training.DataTableBean:  63 - FilmList Inside     SEARCHBYBOTH: []

1 个答案:

答案 0 :(得分:0)

您的变量(以及其他类似Category似乎是 null,因为托管bean作为属性的注入未正确执行,您需要进行操作它的值由JSF EL表达:@ManagedProperty("#{filmResultBean}")
我认为不建议将Spring与JSF注释混合用于bean和java类,只需保留其中一个。
在下面的方法中,您尝试通过空电影实例设置films的属性。方法参数films在方法中未被使用,它的实用性是什么?

@Override
public List<FilmResultBean> generateFilmList(FilmResultBean films) {
    ...
    Film film = new Film();
    ...
    films.setTitle(film.getTitle());
    films.setRating(film.getRating());
    films.setRentalRate(film.getRentalRate());
    ...
}