2011-12-16 49 views
15

Tôi có ứng dụng web mùa xuân với hai ngữ cảnh: một (applicationContext) được xây dựng bởi ContextLoaderListener và giây (webContext) được xây dựng bởi DispatcherServlet.Cách kết nối các sự kiện bối cảnh ứng dụng mùa xuân với một bối cảnh khác

Trong phạm vi applicationContext là một bean (org.springframework.security.authentication.DefaultAuthenticationEventPublisher) kích hoạt sự kiện ngữ cảnh mùa xuân.

Nhưng người nhận cho sự kiện được xác định trong webContext. Và người nhận đó không nhận được sự kiện. (Nếu đặt người nhận cho mục đích thử nghiệm trong các applicationContext sau đó nó nhận được sự kiện, nhưng tôi không thể làm điều này, bởi vì tôi cần webContext s cho chức năng của nó.)

Vì vậy, câu hỏi của tôi là, làm thế nào để kết nối các sự kiện từ applicationContext đến webContext?

+0

Bạn có tìm thấy giải pháp nào cho vấn đề của mình không? –

+0

Tôi đoán theo thiết kế Spring không cho phép bạn thực hiện việc này. Nếu không thì sẽ không quá khó hiểu nếu bạn đang gỡ lỗi lớp nào xử lý sự kiện này? Bây giờ thay vì nhìn vào trong một thùng chứa, bạn phải xem xét tất cả – gerrytan

Trả lời

3

Thử di chuyển nhà xuất bản sự kiện sang tệp ngữ cảnh web, nơi cần có khả năng hiển thị trong toàn bộ ngữ cảnh ứng dụng. Sự cố tương tự xảy ra khi configuring method security in the parent application context. Ngữ cảnh ứng dụng gốc (được tải bởi ContextLoaderListener) không nhận thức được ngữ cảnh của trẻ em (web).

Bạn cũng có thể sử dụng một ngữ cảnh ứng dụng cho toàn bộ ứng dụng nếu bạn không thực sự cần mối quan hệ cha-con giữa hai ứng dụng. Thường thì nó sẽ bị cản trở và dễ dàng hơn nếu tất cả đậu được định nghĩa trong cùng một không gian.

+0

Đây không phải là giải pháp, bởi vì câu hỏi là về cách xử lý hai ngữ cảnh. (Tôi không thể di chuyển các công cụ bảo mật trong bối cảnh web, bởi vì tôi explicite sử dụng nó trong ứng dụng (nó là một ứng dụng với ACLs)). – Ralph

+0

Bạn có thực sự cần hai bối cảnh ứng dụng riêng biệt không? Nghe có vẻ như một tình huống mà nó có thể đơn giản hơn chỉ để có một. –

+0

điều này nghe có vẻ tốt hơn nhiều. Tôi sẽ kiểm tra lý do tại sao tôi sử dụng hai bối cảnh, và xem nếu tôi có thể hợp nhất chúng. – Ralph

2

Như đã nêu trong tài liệu cho khung mùa xuân, cơ chế ApplicationEvent đơn giản chỉ được thiết kế để sử dụng trong cùng một ngữ cảnh ứng dụng, tôi không biết rằng có thể truyền bá sự kiện đến ngữ cảnh con.

Nếu bạn cần một giải pháp nâng cao hơn, bạn có thể xem xét bằng cách sử dụng giải pháp nâng cao hơn như Dịch vụ tin nhắn Java hoặc Tích hợp mùa xuân.

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#context-functionality-events

0

Chúng ta có thể sử dụng thẻ nhập khẩu để nhập khẩu/cầu 2 hoàn cảnh khác nhau tạo ra một cách tầm nhìn của các sự kiện/đậu có sẵn và chia sẻ.

<import resource="applicationContext_name.xml"/> 

Trong lần nhập khẩu này, xml được định cấu hình được tạo từ ContextLoaderListener trong ngữ cảnh xml của DispatcherServlet.

4

Tôi nghĩ câu trả lời thực tế là bạn có thể muốn cấu hình ứng dụng của bạn khác nhau (do đó bạn chỉ có một ngữ cảnh) Tôi nghĩ rằng trong web.xml của bạn, bạn cần phải làm điều gì đó như thế này:

<servlet> 
    <servlet-name>example</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>    
      classpath:/META-INF/applicationSpringConfig.xml 
     </param-value> 
    </init-param> 
</servlet> 

Nhưng để trả lời câu hỏi sâu hơn. Một người khác chỉ ra rằng bạn có thể sử dụng bao gồm trong tệp mùa xuân của bạn (thực sự ở trên bạn có thể có nhiều hơn một springconfig được chỉ định trong servlet dispatcher của bạn). Nhưng khi bạn bao gồm các tệp ngữ cảnh khác, bạn không chia sẻ các bản sao của các bean, chỉ các định nghĩa.

Các ứng dụng Spring Modularising là nhược điểm thực sự duy nhất của mùa xuân so với EJB vv. Điều này dẫn đến việc sử dụng OSGi vào mùa xuân. Và câu trả lời cho câu hỏi cơ bản của bạn về cách chia sẻ bối cảnh mùa xuân, chính thức bạn chia sẻ các cá thể đậu mùa xuân giữa các bối cảnh bằng cách sử dụng OSGi (spring dm)

6

Tôi đã gặp vấn đề tương tự -bối cảnh.Tuy nhiên, bạn có thể giải quyết vấn đề của mình bằng cách nối dây cho trình xử lý sự kiện của bạn theo cách thủ công, như thế này (mã này không được biên dịch do đó nó chưa được kiểm tra):

@Component  
public class BeanInWebContext implements ApplicationListener<SomeEvent> { 

    @Autowired 
    private ApplicationContext webContext; 

    @PostConstruct 
    public void registerAsListener() { 
     // get parent context 
     AbstractApplicationContext appContext = (AbstractApplicationContext) webContext.getParent(); 
     // register self as a listener, this method is in AbstractApplicationContext 
     appContext.addApplicationListener(this); 
    } 

    @Override 
    public void onApplicationEvent(SomeEvent event) { 
    } 

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