2013-01-05 36 views
9

Có lẽ câu hỏi của tôi là một trong những tầm thường, nhưng tôi không bao giờ sử dụng một phạm vi ứng dụng đậu trước. Tôi cần bean ứng dụng vì tôi phải thực hiện các giao dịch tốn thời gian trên cơ sở dữ liệu. tìm kiếm của tôi không thỏa mãn sự tò mò của tôi chút nào. Tôi không biết tại sao nhưng tôi không quản lý để khởi tạo bean (nó là null) hoặc ứng dụng bị lỗi. Vì vậy, tôi có một đậu phạm vi ứng dụngJSF phạm vi ứng dụng instantiation và tiêm

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 
... 
} 

háo hức = true Tôi đọc mà nói với JSF để bắt đầu đậu mỗi khi máy chủ ứng dụng (tôi sử dụng GlassFish) được bắt đầu.

Tôi đọc ở một số nơi mà tôi chỉ cần đặt chú thích này và bean được khởi tạo. Đối với tôi nó không ... Sau khi tôi đọc rằng nếu tôi muốn tiêm đậu ứng dụng vào đậu khác tôi phải sử dụng @PostConstuct chú thích

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @ManagedProperty(value = "#{container}") 
    private ApplicationContainer container; 

    @PostConstruct 
    public void init() { 
    container.contructContainer(); 
    } 

này đưa ra một lỗi trong đậu khác mà tôi tiêm the TestsBean into ...

  • nếu bean ứng dụng được khởi tạo khi máy chủ khởi động phương thức nào nó gọi trong phần thân của ứng dụng để thực hiện các hành động cần thiết? Hoặc trong đậu tiêm nó được thực hiện trong phương pháp xây dựng bài?

Hãy cho tôi biết cách thích hợp để xử lý các hạt ứng dụng. Tôi thực sự bối rối ...

Cảm ơn tất cả vì đã dành thời gian của bạn!

Trả lời

21

Có 2 lỗi tiềm ẩn.

Đầu tiên, @ManagedBean(eager=true) hoạt động, như its javadoc cho biết, chỉ trên các hạt được quản lý JSF được quản lý. Vì vậy, nó chỉ hoạt động khi bạn đã sử dụng @ApplicationScoped gói javax.faces.bean (và do đó không phải gói javax.enterprise.context!). Các eager=true về cơ bản có nghĩa là đậu sẽ được tự động khởi tạo trên khởi động webapp thay vì chỉ sau này khi nó được tham chiếu lần đầu tiên trong EL.

Thứ hai, tên bean được quản lý mặc định là tên lớp ở dạng thập phân theo đặc tả Javabeans. Bạn đã không chỉ định rõ ràng bất kỳ tên bean được quản lý nào như @ManagedBean(name="container", eager=true), vì vậy tên bean được quản lý sẽ mặc định là applicationContainer, tuy nhiên bạn vẫn cố gắng tham chiếu nó như #{container} thay vì #{applicationContainer}.

Bạn không rõ ràng về vấn đề/lỗi nào bạn đang gặp phải. Nếu bạn nhận được một ngoại lệ, bạn hoàn toàn nên đọc/giải thích nó và nếu bạn không thể hiểu nó, hãy sao chép toàn bộ nó - bao gồm cả stacktrace- trong câu hỏi. Nó đại diện cho toàn bộ câu trả lời cho vấn đề của bạn. Bạn chỉ cần giải thích và hiểu nó (hoặc chúng ta chỉ cần giải thích nó theo thuật ngữ của giáo dân). Bạn thực sự không nên bỏ qua chúng và để chúng ra câu hỏi như thể chúng là trang trí không liên quan. Họ không phải!

Tất cả với tất cả, cách tiếp cận đầy đủ và đúng đắn sẽ là, hoàn chỉnh với các tờ khai nhập khẩu chỉ để đảm bảo, và còn có thể in stdout một số người đàn ông nghèo để gỡ lỗi:

package com.example; 

import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 

    public ApplicationContainer() { 
     System.out.println("ApplicationContainer constructed"); 
    } 

} 
package com.example; 

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    @ManagedProperty("#{applicationContainer}") 
    private ApplicationContainer container; 

    public TestsBean() { 
     System.out.println("TestsBean constructed"); 
    } 

    @PostConstruct 
    public void init() { 
     System.out.println("ApplicationContainer injected: " + container); 
    } 

    public void setContainer(ApplicationContainer container) { 
     this.container = container; 
    } 

} 
+0

Cảm ơn bạn BalusC cho bạn câu trả lời dồi dào. Tôi đã không đặt ngoại lệ của mình trong câu hỏi bởi vì tôi muốn là một câu hỏi chung, không phải là một câu hỏi cụ thể. Tôi nghĩ rằng các phạm vi ứng dụng đậu cần một cụ thể hơn, khác nhau khởi tạo chúng phần còn lại và tôi đã không tìm thấy một khởi tạo thích hợp, chỉ cần bit và miếng. Một lần nữa cảm ơn bạn đã dành thời gian! – CyberGriZzly

Các vấn đề liên quan