2013-02-25 23 views
10

Bắt lỗi này trong Restlet:Restlet tài nguyên máy chủ với các thông số cần thiết constructor

ForwardUIApplication ; Exception while instantiating the target server resource. 
java.lang.InstantiationException: me.unroll.forwardui.server.ForwardUIServer$UnsubscribeForwardUIResource 

Và tôi biết chính xác lý do tại sao. Đó là bởi vì constructor của tôi trông như thế này:

public UnsubscribeForwardUIResource(MySQLConnectionPool connectionPool) { 

Và Restlet truy cập vào tài nguyên như vậy:

router.attach(Config.unsubscribeUriPattern(), UnsubscribeForwardUIResource.class); 

Vấn đề là tôi thực sự cần điều đó lý luận ctor. Làm cách nào để tôi có thể truy cập? (Lưu ý tôi không sử dụng bất kỳ khung IOC nào, chỉ có rất nhiều đối số ctor nhưng thực tế đây là một mẫu IOC).

Trả lời

10

Bạn có thể sử dụng ngữ cảnh để chuyển ngữ cảnh cho thuộc tính cho thể hiện tài nguyên của mình.

Từ ServerResource API doc:

Sau instantiation sử dụng constructor mặc định, Resource.init thức (Context, yêu cầu, đáp ứng) phương pháp được gọi, thiết lập các bối cảnh, yêu cầu và trả lời. Bạn có thể đánh chặn điều này bằng cách ghi đè phương thức Resource.doInit().

Vì vậy, vào thời điểm tập tin đính kèm:

router.getContext().getAttributes().put(CONNECTION_POOL_KEY, connectionPool); 
router.attach(Config.unsubscribeUriPattern(), UnsubscribeForwardUIResource.class); 

Tại lớp UnsubscribeForwardUIResource của bạn, bạn sẽ phải di chuyển mã khởi tạo từ các nhà xây dựng để de doInit phương pháp:

public UnsubscribeForwardUIResource() { 
    //default constructor can be empty 
} 

protected void doInit() throws ResourceException { 

    MySQLConnectionPool connectionPool = (MySQLConnectionPool) getContext().getAttributes().get(CONNECTION_POOL_KEY); 

    // initialization code goes here 
} 
1

Nếu bạn không sử dụng IoC, bạn nên thực hiện thủ công, ví dụ: bạn có thể đính kèm cá thể Restlet thay vì lớp. Bạn có thể sử dụng Context để truy xuất thuộc tính.

Nhưng có thể nó có nhiều khả năng hơn để sử dụng một thùng chứa IoC, điều này sẽ đơn giản hóa và giảm mã bản mẫu, ví dụ: điều này là dành cho mùa xuân: http://pastebin.com/MnhWRKd0

+0

mỗi tài liệu nó không thể đính kèm một thể hiện. – djechlin

+0

Ồ, bạn nói đúng. Bạn có thể đính kèm cá thể 'Restlet', nhưng không phải' ServerResource'. Bạn có thể sử dụng 'Restlet' khi nào? Nếu không, sau đó chỉ cần sử dụng 'doInit' để nối Connnection từ' Context'. – kan

+0

Bạn đã thử gắn nó bằng Bộ lọc (org.restlet.routing.Filter) chưa? – Caleryn

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