Grails: Truy cập đậu mùa xuân trong việc đóng cửa định mệnh của mã Bootstrap?


6

Tôi đang tìm cách truy cập vào một bean trong việc hủy đóng của tôi trong Bootstrap.groovy của dự án grails của tôi. Bất kỳ ý tưởng về làm thế nào để đạt được điều này?

Tôi dường như không có quyền truy cập vào servletContext ...?

15

Bạn có thể lấy một tham chiếu đến applicationContext từ khắp mọi nơi (kể cả phá hủy đóng bootstrap) sử dụng rằng đoạn mã:

def ctx = org.codehaus.groovy.grails.web.context.ServletContextHolder.servletContext.getAttribute(org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes.APPLICATION_CONTEXT); 

Bắt một tham chiếu đến một bean là dễ dàng như ctx.beanName.

Đây là một lớp util nhỏ (viết bằng Java) có thể đơn giản hóa nhiệm vụ này:

import org.springframework.context.ApplicationContext; 
import org.codehaus.groovy.grails.web.context.ServletContextHolder; 
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes; 

public class SpringUtil { 

    public static ApplicationContext getCtx() { 
     return getApplicationContext(); 
    } 

    public static ApplicationContext getApplicationContext() { 
     return (ApplicationContext) ServletContextHolder.getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT); 
    } 

    @SuppressWarnings("unchecked") 
    public static <T> T getBean(String beanName) { 
     return (T) getApplicationContext().getBean(beanName); 
    } 

} 

và một ví dụ:

def bean = SpringUtil.getBean("beanName") 

Chúc mừng, Sigi


2

Rất tiếc, tôi không thể tìm thấy bất kỳ ví dụ nào về bất kỳ ai ngay cả sử dụng việc hủy khối đóng trong Bootstrap. Từ các tài liệu:

 
    It is not guaranteed that {{destroy}} will be called unless the 
application exits gracefully (for example by using the application 
server's shutdown command) so don't rely on it too much 

Là một đoán, tôi phải nói rằng ServletContext đã bị phá hủy trước khi {{}} phá hủy đóng Bootstrap được thực hiện, vì vậy đậu mà bạn đang cố gắng truy cập đã biến mất rồi. Có ai xác nhận không?


6

Tôi biết tôi m tất cả muộn ở đây và tất cả, nhưng kể từ khi tôi tìm thấy điều này thông qua Google ...

Lớp BootStrap của bạn được tôi bị từ chối với hạt đậu mùa xuân theo tên, giống như tất cả các dịch vụ và bộ điều khiển và các công cụ. Nếu bạn muốn một hạt, chỉ cần def nó theo tên và nó sẽ hiển thị. Nếu không, chỉ cần def grailsApplication và đi đến grailsApplication.mainContext.getBean, v.v.