2012-11-05 30 views

Trả lời

18

GỢI Ý:trước khi đọc thêm bất kỳ chi tiết nào có xem http://showcase.omnifaces.org/components/param. Tự mình làm có lẽ đã lỗi thời khi nhìn thấy cách thức các omnifaces là một tiêu chuẩn thực tế ngày nay. Có lẽ tôi sẽ không viết điều này nếu các omnifaces có điều này tại thời điểm

CDI không giải quyết các vấn đề chuyên biệt như tiêm tham số yêu cầu. Đó là nghĩa vụ phải được giải quyết bằng phần mở rộng.

Điều này đã được cung cấp bằng cách hàn. http://docs.jboss.org/seam/3/solder/latest/reference/en-US/html/injectablerefs.html

Nó có thể sẽ được bao gồm trong Deltaspike 0,4-ủ hoặc tương tự.

Điều đó nói rằng mã yêu cầu khá đơn giản để tự triển khai. Ví dụ dưới đây:

Annotation để sử dụng cho các điểm tiêm (Ví dụ private String myParam;)

import javax.enterprise.util.Nonbinding; 
import javax.inject.Qualifier; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 

import static java.lang.annotation.ElementType.*; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 


@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER }) 
public @interface RequestParam { 
    @Nonbinding 
    public String value() default ""; 
} 

Bây giờ chúng ta có chú thích nhưng chúng ta không thể chỉ cần hỏi container sự phụ thuộc tiêm một @RequestParam - chúng tôi rõ ràng là cần phải có thực hiện.

import javax.enterprise.inject.Produces; 
import javax.enterprise.inject.spi.InjectionPoint; 
import javax.faces.context.FacesContext; 
import javax.inject.Inject; 

public class RequestParamProducer implements Serializable { 

    private static final long serialVersionUID = -4260202951977249652L; 
    @Inject 
    FacesContext facesContext; 

    // Producer for @RequestParam 
    @Produces 
    @RequestParam 
    String getRequestParameter(InjectionPoint ip) { 
     String name = ip.getAnnotated().getAnnotation(RequestParam.class) 
       .value(); 

     if ("".equals(name)) 
      name = ip.getMember().getName(); 

     return facesContext.getExternalContext().getRequestParameterMap() 
       .get(name); 
    } 
} 

Vậy nó hoạt động như thế nào? Cũng khá đơn giản nó đầu tiên kiểm tra nếu bạn đã xác định những gì bạn muốn tham số như trong @Requestparam("longAndTerribleFieldNameBestToSpecify");

Nếu bạn không làm như vậy sẽ sử dụng fieldName. Vì vậy, nếu bạn chú thích một setter gọi là setMyInstance nó sẽ tìm kiếm một tham số được gọi là setMyInstance.

Trường hợp sử dụng thông thường sẽ là có biến Chuỗi được đặt tên chính xác như thông số bạn muốn.

Lưu ý rằng chúng tôi tiêm FacesContext, cũng phải được tạo ra. Một nhà sản xuất FacesContext có thể trông như thế này:

class FacesContextProducer { 

    @Produces @RequestScoped FacesContext getFacesContext() { 

     return FacesContext.getCurrentInstance(); 

    } 

} 

End sử dụng:

@Inject 
@RequestParam 
private String session_secret; 

Lưu ý rằng điều này sẽ không làm việc cho Servlet hoặc tương tự như nó đòi hỏi quyền truy cập vào FacesContext. Trong những trường hợp này, người ta cần bọc mũi tiêm với ví dụ một hạt đậu được @RequesScoped. Thay vào đó, bạn tiêm đậu đó.

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