2012-07-11 30 views
6

Tôi có một Sessionful State Bean (SFSB) hoạt động như mô-đun xác thực. Trong SFSB tôi lưu trữ người dùng hiện tại được đăng nhập. Hơn nữa tôi có một số mặt tiền (đó là Session Session Beans (SLSB)) xử lý các công cụ JPA/SQL cho các thực thể của tôi. Để kiểm tra quyền truy cập của người dùng hiện tại, tôi cố gắng gọi SFSB ra khỏi SLSB. Nhưng trường người dùng hiện tại luôn là "null" khi được gọi từ SLSB. Khi gọi SFSB trực tiếp, trường người dùng hiện tại được đặt chính xác ... Để gọi tôi sử dụng chú thích @EJB.Java EE 6: Làm cách nào để gọi Bean phiên trạng thái từ Bean phiên không trạng thái?

Bất kỳ ý tưởng nào về sự cố có thể là gì? Có phải đó là một vấn đề bối cảnh? Nói chung có thể gọi SFSB từ SLSB bảo quản trạng thái của nó không?

Rất cám ơn trước!

+0

Có lẽ yo có thể thử chuyển tham chiếu đến SFSB đến SLSB của bạn ...Chưa bao giờ thử nó, nhưng có vẻ như nó có thể hoạt động. – jahroy

+0

có đó chính xác là những gì tôi đang cố gắng thực hiện bằng cách sử dụng tiêm phụ thuộc với chú thích @EJB. nhưng điều này không hoạt động ... – salocinx

+1

Tôi không đề cập đến việc tiêm phụ thuộc. Tôi có nghĩa là vượt qua SFSB như là một tham số phương pháp. Dependency injection không có ý nghĩa trong kịch bản này. Hãy nhớ rằng SLSB chỉ ngồi trong một hồ bơi đang chờ các yêu cầu dịch vụ. Họ không có nhà nước chút nào và không biết ai đang gọi họ. Họ chỉ thực hiện nhiệm vụ. – jahroy

Trả lời

8

Bạn không nên gọi bean phiên trạng thái từ bean phiên không trạng thái.

Dưới đây là một số đọc: JEE6 Tutorial - Session Beans

đậu không quốc tịch không biết bất cứ điều gì về phiên của bạn. Bất cứ lúc nào bạn gọi nó, nó là phi trạng thái. Sau đó, nó gọi một bean phiên trạng thái. Không ngạc nhiên khi nó không có bất kỳ ngữ cảnh nào liên quan đến trạng thái phiên làm việc của máy khách vì nó được gọi từ đối tượng không trạng thái.

Tôi không biết liệu nó có hiệu quả hay không, nhưng bạn có thể cố gắng lấy bối cảnh bằng cách thực hiện tra cứu JNDI thay vì DI bằng ký hiệu @EJB. Một cái gì đó như thế này trong ejb không quốc tịch có thể làm việc. Có thể bạn sẽ phải chơi với nó và tôi không thể đảm bảo bất cứ điều gì. Nó sẽ nhận được bối cảnh của khách hàng gọi là ejb không quốc tịch. Khách hàng sẽ cần phải có bối cảnh/phạm vi phiên hoặc quên nó.

@Resource SessionContext sessionContext; 

MyStatefulBean msb = (MyStatefulBean)sessionContext.lookup("ejb/MyStatefulBean"); 
msb.doSomething(fubar); 

Tốt hơn nên gọi bean phiên trạng thái từ khách hàng có phạm vi phiên hoặc từ một ejb trạng thái khác. Không quốc tịch và nhà nước có lý do khác nhau để được.

+0

cảm ơn câu trả lời của bạn. nhưng điều này không làm việc cho tôi ... SFSB vẫn không có ngữ cảnh phiên. bất kỳ ý tưởng nào khác? – salocinx

+0

Để sử dụng SessionContext chỉ cần đã xác thực thành công againt một lĩnh vực an ninh trước đây. – salocinx

0

Nếu bạn tiêm phiên đậu stateful bên đậu quốc tịch bởi nhìn lên cũng không làm việc vì dụ mới sẽ được tạo ra cho đậu stateful vì vậy nó không nắm giữ bất kỳ giá trị như thông tin người dùng đăng nhập và vv ...

4

Bạn không nên tiêm EJB có trạng thái vào EJB không quốc tịch. Điều này có thể có những hậu quả rất khó khăn, vì vòng đời của một EJB trạng thái được bắt đầu khi được tiêm và quản lý bằng cách sở hữu bean. Trong trường hợp xấu nhất, EJB không trạng thái có thể được tái sử dụng bởi máy chủ ứng dụng cho những người dùng khác nhau, sau đó sẽ truy cập vào cùng một EJB có trạng thái. Trong trường hợp của bạn, người dùng sẽ được xác định là người dùng khác.

Có thể bạn muốn kết hợp EJB có trạng thái với phiên HTTP hiện tại, không được thực hiện tự động như nhiều người cho rằng. Để biết thêm chi tiết, đọc phần có tên EJB 3 Không phải là bối cảnh ở đây: Contexts and Dependency Injection article

Để kết hợp EJB nhà nước với phiên, bạn cần tiêm tự do EJB vào đậu CDI phiên, có thể được tiêm tự do vào một đậu không trạng thái - thực ra chỉ có một stub được tiêm và bean phiên scoped (cùng với EJB stateful) được tạo ra cho mỗi phiên mới.

Có lẽ cách tiếp cận tốt hơn nữa là trích xuất giao diện của đậu trạng thái và sử dụng nhà sản xuất CDI để tạo phiên triển khai phạm vi phiên của đậu béo. Bằng cách này bạn cũng có thể xử lý các trường hợp, khi một EJB stateful được tự động loại bỏ trên một ngoại lệ trong EJB. Trong trường hợp này, bạn có thể muốn tạo lại EJB trong cùng một phiên.

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