2015-05-20 14 views
10

Trong một ứng dụng Java EE 6 chạy trên GlassFish (3.1.2.2b5), giả sử bạn có một ConfigurationService, mà đọc một số tác phẩm thuộc tính và bàn tay ra giá trị tài sản cho phù hợp:Tiêm EJB vào EclipseLink SessionCustomizer để cung cấp Oracle tên schema

@Local 
public interface ConfigurationService { ... } 

@Singleton 
public class ConfigurationServiceImpl implements ConfigurationService { ... } 

Ngoài ra còn có một EclipseLink SessionCustomizer, vì tên lược đồ của một trong những đơn vị kiên trì (Oracle cơ sở dữ liệu) trong các ứng dụng cần phải được lập trình thiết lập, tức là được cấu hình từ các tập tin thuộc tính đề cập trước đây. Các SessionCustomizer được cấu hình trong một persistence.xml và thực hiện có chứa một tham chiếu đến ConfigurationService:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"... 
    <persistence-unit name="myPU" transaction-type="JTA"> 
     <property name="eclipselink.session.customizer" value="MySessionCustomizer"/> 
     ... 

public class MySessionCustomizer implements SessionCustomizer { 
    @EJB 
    private ConfigurationService configurationService; 
    @Override 
    public void customize(Session session) { 
     session.getLogin().setTableQualifier(configurationService.getSchemaName()); 
     ... 

Có thể có ConfigurationService tiêm theo cách như vậy, do đó nó có sẵn khi SessionCustomizer được khởi tạo? Các trường hợp trên không thành công vì phiên bản ConfigurationService vẫn còn trống, tức là việc tiêm vẫn chưa xảy ra. Quan sát này tương ứng với các mục nhật ký của máy chủ. Có vẻ như cơ chế tiêm phụ thuộc luôn được bắt đầu sau khi các đơn vị bền vững - và do đó SessionCustomizer - được instatiated. Tôi đã nhầm lẫn với các chú thích khác nhau (@Startup, @DependsOn(...), ...) nhưng không có kết quả. Kết luận của tôi có đúng hay không có cách nào khác để EJB khởi tạo và tiêm sớm hơn?

Trả lời

2

Vì trình tùy biến phiên được tạo bởi EclipseLink (không phải bởi vùng chứa của bạn), vùng chứa không chịu trách nhiệm cho việc tiêm các phụ thuộc.

Sử dụng tra cứu JNDI.

+0

Ví dụ về mã có thể tìm thấy tại đây: http://stackoverflow.com/a/28971109/3375325 – lazlev

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