2012-05-31 23 views
5

Tôi đang cố gắng sử dụng mùa xuân để cung cấp đậu được quản lý để jsf. Tôi giả định rằng @ManagedBean sẽ được chọn bởi JSF container để liên kết EL trong JSF với bean được quản lý ngay cả khi tôi sử dụng spring bằng cách cấu hình việc sử dụng spring trong faces-config.xml.jsf 2.0 mùa xuân 3 phạm vi yêu cầu không làm việc

Mùa xuân sẽ cung cấp hạt nhưng bây giờ , người quản lý phạm vi đậu?

Tôi đã thử chú thích sau trên đậu để nó trở thành Phạm vi yêu cầu nhưng chúng không hoạt động.

@ManagedBean(name="helloBean") //meant for JSF 
@RequestScoped //meant for JSF 
@Scope(value="request") //meant for spring 
@Controller //meant for spring 
public class HelloBean implements Serializable { 

Thực ra trước đây tôi đã sử dụng JSF đồng bằng và @ManagedBean và @RequestScoped đang làm việc tốt. Bây giờ như tôi đã cố gắng để tích hợp bằng cách sử dụng mùa xuân phạm vi không hoạt động.

Tôi thậm chí đã thử đặt phạm vi đậu trong cấu hình mùa xuân nhưng chúng hoạt động như mong đợi trong ngữ cảnh của mùa xuân (singleton và nguyên mẫu) nhưng không phải bối cảnh yêu cầu web.

Tôi đã cố gắng tránh phải sử dụng chú thích trên @Scope và @Controller với hy vọng rằng JSF sẽ quản lý phạm vi nhưng dường như không thích.

Dưới đây là đoạn tệp của tôi cho cấu hình mùa xuân và MyHelloBean có thể sẽ giúp giao tiếp tốt hơn.

<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" /> 

<bean id="myHelloBean" class="com.mkyong.common.MyHelloBean" init-method="init" > 
     <property name="helloBean" ref="helloBean"></property> 
</bean> 

@ManagedBean 
@RequestScoped 
@Scope(value="request") 
@Controller 
public class MyHelloBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    //@ManagedProperty(value = "#{helloBean}") 
    private HelloBean helloBean; 

xem ở trên MyHelloBean Tôi đang sử dụng spring DI để đặt helloBean được đặt vào mùa xuân. Tôi đã nhận xét @ManagedBean mà tôi nghĩ rằng tôi có thể để nó ở đó vì nó sẽ bị bỏ qua bởi mùa xuân bất kỳ cách nào và JSF sẽ không xử lý nó tôi đoán nhưng để được an toàn tôi nhận xét nó ra cho JSF không xử lý nó.

Để hoàn thành, tôi sử dụng bên dưới trong cấu hình khuôn mặt để kích hoạt sử dụng lò xo.

<el-resolver> 
org.springframework.web.jsf.el.SpringBeanFacesELResolver 
</el-resolver> 

Kính trọng,

Miten.

Trả lời

2

Cách tiếp cận của bạn hơi khó hiểu theo nghĩa là có vẻ như bạn đang trộn cấu hình Spring XML và cấu hình Spring Annotation-based. Như được mô tả dưới dạng ví dụ here, nếu bạn đang sử dụng cấu hình có chú thích thì bạn nên có:

<context:component-scan base-package="com.yourcom.package" /> 

để đặt hàng Quét mùa xuân cho chú thích. Ngược lại, nếu bạn đang sử dụng cấu hình XML thì bạn nên có:

<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" scope="request" /> 

như theo mặc định scope cho một đậu mùa xuân là singleton.

+0

Bạn hoàn toàn đúng. Tôi đã có thể thêm scope = request vào spring config và giữ các hạt jsf cũ của tôi với các chú thích của chúng và nó hoạt động như mong đợi. Tôi đã nhầm lẫn với chú thích và phạm vi ở phía bên xuân. Trả lời khác chia sẻ một số ý tưởng nhiều hơn về phạm vi và tiêm nhưng tôi cảm thấy đối với tôi điều này là đơn giản và dễ dàng di chuyển theo hướng tích hợp mùa xuân vào jsf. Tôi biết chỉ có hai phạm vi cho đậu mùa xuân. các phạm vi khác được liệt kê ở đâu? Spring-web (trình tải ngữ cảnh) hiểu các phạm vi mới này và do đó chúng có ý nghĩa trong ngữ cảnh web-web? hoặc họ có giá trị cho mùa xuân cốt lõi quá tôi nghi ngờ? – Miten

+0

[Tham khảo phạm vi Spring Bean] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-scopes) – nobeh

5

Nhóm của chúng tôi phải đối mặt với các vấn đề tương tự khi tích hợp JSF và Spring bean, bao gồm các vấn đề với phạm vi của chúng. Và ở đây tôi chia sẻ kiến ​​thức của chúng tôi.

Scopes

Về cơ bản bây giờ, khi bạn định nghĩa trong bối cảnh ứng dụng của bạn, mà mùa xuân sẽ được quản lý đậu của bạn, do đó phạm vi. Spring sẽ ánh xạ các chú thích phạm vi JSF tới các chú thích phạm vi gốc của mình.

  • Ví dụ khi cả hai mùa xuân và hỗ trợ JSF cung cấp phạm vi:

@RequestScoped chú thích sẽ được ánh xạ tới @Scope ("yêu cầu") chú thích Spring, vv với phạm vi được hỗ trợ khác.

  • Ví dụ khi mùa xuân không hỗ trợ phạm vi cung cấp JSF:

@ViewScoped không được định nghĩa trong chú thích phạm vi có nguồn gốc Spring, do đó (không chắc chắn) nó sẽ sử dụng phạm vi mặc định mùa xuân, mà là singleton, hoặc phạm vi yêu cầu (không chắc chắn).

Bean tiêm

Trong JSF2 bạn sử dụng @ManagedProperty chú thích để tiêm, trong khi mùa xuân sử dụng chú thích @Autowired. Sự khác biệt và lựa chọn nào?

  • Tiêm đậu với @ManagedProperty mùa xuân:

thành phần mùa xuân bạn muốn tiêm phải có giá trị mà sẽ phù hợp với giá trị JSF tiêm chú thích của: @Component (value = "valueMatches") tiêm với @ ManagedProperty (value = "valueMatches").

  • Tiêm đậu mùa xuân với @Autowired:

thành phần mùa xuân bạn muốn tiêm phải không đòi hỏi một giá trị tùy chỉnh để phân biệt, nếu nó là việc thực hiện duy nhất của đậu bạn đang tiêm: @Component được tiêm với @Autowired.

Cách của chúng tôi

Chúng tôi đã sử dụng chú thích của Spring để xác định Đậu, Phạm vi và Tiêm.

Chúng tôi đánh dấu các hạt JSF bằng các chú thích @Scope (value = "mongScope"), @Controller (value = "beanName") và @Qualifier (value = "beanName"). Sau đó có thể được truy cập từ ngữ cảnh JSF với sự trợ giúp của trong faces-config.xml thông qua giá trị "beanName" được định nghĩa trong chú thích @Controller.

Chúng tôi đã đánh dấu dịch vụ Spring bằng chú thích @Service.

Chúng tôi đã tiêm dịch vụ Spring và JSF beans bằng @Autowired annotation.

Chúng tôi đã tìm thấy hiển thị ViewScope và FlashScope trên web và sử dụng chúng cho hạt cà phê của chúng tôi. Vì vậy, chúng tôi đã không mất bất kỳ phạm vi JSF2 và thậm chí thêm mới.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn đã trả lời. Tôi đoán tôi cần phải đọc một số ghi chú liên quan đến mùa xuân (mùa xuân mvc?) Để hiểu các chú thích, dịch vụ, thành phần, vòng loại chú thích mới này. Tôi thích nhận được đi mà không sử dụng chúng và chỉ cần sử dụng scope = "yêu cầu" trong cấu hình đậu như chỉ ra bởi trả lời khác. – Miten

+0

Vâng, nó là hoàn toàn tốt đẹp. Trong trường hợp của chúng tôi, chúng tôi cần ViewScope của JSF, nhưng ứng dụng của chúng tôi dựa trên Spring bean, vì vậy điều này tốt hơn cho chúng tôi. Chỉ cần lưu ý các vấn đề có thể xảy ra với Spring và JSF2 được lưu ý ở đây, đặc biệt nếu bạn định tiêm các thành phần Spring và sử dụng các trạng thái được hỗ trợ bởi JSF, nhưng không được Spring hỗ trợ. – JMelnik

+0

@JMelnik bạn có thể chia sẻ mã FlashScope của mình không? Tôi đang gặp khó khăn khi tìm nó trực tuyến – Andre

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