2011-04-11 93 views
2

我有這樣的服務豆:@ManagedProperty註釋類型返回null

@Stateless 
public class BookService 
{ 
    @PersistenceContext(unitName="persistentUnit") 
    protected EntityManager entityManager; 

    public BookModel find(Long id) { 
     return entityManager.find(BookModel.class, id); 
    } 
} 

而且支持Bean的facelet頁:

@ManagedBean(name = "bookBean") 
@RequestScoped 
public class BookBean implements Serializable 
{ 
    @EJB 
    private BookService bookService; 

    @ManagedProperty(value="#{param.id}") 
    private Long id; 

    private DataModel<BookModel> books; 
    private BookModel currentBook; 

    @PostConstruct 
    public void init() { 
     if (id == null) { 
      // UPDATE: Retrieve a list of books. 
     } else { 
      // UPDATE: id shouldn't be null here. 
      // Get detail info about a book using the id 
      currentBook = bookService.find(id); 
     } 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public BookModel getCurrentBook() { 
     return currentBook; 
    } 

    public void setCurrentBook(BookModel currentBook) { 
     this.currentBook = currentBook; 
    } 
} 

爲什麼是id值總是返回null即使URL返回爲bookedit.jsf?id=5418我不明白這一點。

另外,我發現EntityManager#find方法的限制性很強,因爲它只接受主鍵值作爲第二個參數。如果我想傳遞[哈希]值而不是主鍵,該怎麼辦?我如何用EntityManager#find方法做到這一點?

P.S.我注意到OpenJPA和EclipseLink實現的EntityManager#find要求是相同的。嗯...

+0

您正在嘗試在@PostConstruct中使用注入值。我不知道第一個會發生什麼 - @ManagedProperty注入或@PostConstruct。你檢查過了嗎? – Osw 2011-04-11 20:06:34

+0

@Osw:@ @ PostConstruct在所有依賴注入之後運行,所以這部分是好的。 – BalusC 2011-04-11 22:05:28

+0

@BalusC:根據DI和'@ PostContruct'文檔,您是正確的。儘管如此,我不確定爲什麼我要'null'而不是'5148'。這很奇怪! – ChuongPham 2011-04-12 04:13:10

回答

2

我剛剛在我的一個託管的bean中嘗試了這個,它正在工作。這裏是相關的代碼,它基本上和你的一樣:

@ManagedBean 
@RequestScoped 
public class TestBean { 
    @ManagedProperty(value = "#{param.id}") 
    private Long prop; 

    @PostConstruct 
    public void init() { 
     System.out.println(prop); 
     // prints 1234 if I go to the url with http://localhost/page.jsf?1234 
    } 

    public Long getProp() { 
     return prop; 
    } 

    public void setProp(Long prop) { 
     this.prop = prop; 
    } 
} 

我在glassfish 3.1.1上運行這個。我唯一的想法可能是注入的EJB在某種程度上搞亂了ManagedBean中的請求範圍?