Xác định và giải quyết javax.el.PropertyNotFoundException: Target Unreachable


127

Khi cố gắng tham chiếu một bean được quản lý trong EL như vậy #{bean.entity.property}, đôi khi một javax.el.PropertyNotFoundException: Target Unreachablengoại lệ được đưa ra, thông thường khi một thuộc tính bean được đặt hoặc khi một hành động bean được gọi.

Dường như có năm loại tin nhắn khác nhau:

  1. Không thể truy cập mục tiêu, số nhận dạng 'bean' được giải quyết thành null
  2. Không thể truy cập mục tiêu, 'thực thể' trả về null
  3. Không thể truy cập mục tiêu, 'null' trả về null
  4. Không thể truy cập mục tiêu, '' 0 '' được trả về null
  5. Không thể truy cập mục tiêu, 'ngoặcSuffix' trả về null

Tất cả chúng có ý nghĩa gì? Chúng được gây ra như thế nào và chúng nên được giải quyết như thế nào?


Đối với những người sử dụng weblogic, hãy thử liên kết này. /programming/45422943/why-is-target-unreachable-identifier-resolve-to-null-on-weblogic/45490295#45490295
DenisMP

Đối với những người sử dụng mùa xuân và weblogic, hãy thử nhìn vào liên kết này. /programming/45422943/why-is-target-unreachable-identifier-resolve-to-null-on-weblogic?noredirect=1#comment77843630_45422943
DenisMP

Thật bất ngờ, điều này đã phá vỡ cho tôi ... Tôi đã sửa lỗi này (nó không nhận ra bean của tôi) bằng cách dừng máy chủ, xóa javax.faces.jar (Mojarra), xóa thư mục bản dựng của tôi và xóa sạch máy chủ WebLogic của tôi \ tmp \ và \ cache \ thư mục trong Miền, khởi động lại máy chủ, cố gắng xuất bản và gặp sự cố vì không thể tìm thấy javax, SVN hoàn nguyên việc xóa javax.faces.jar (vì vậy bạn chỉ cần di chuyển nó ra và sau đó di chuyển nó trở lại) và xuất bản. Thật bất ngờ, nó đã hoạt động trở lại ...
Andrew

Luôn kiểm tra một vài dòng ở trên để biết các thông điệp nhật ký có liên quan đã xảy ra khi triển khai, đây là nguyên nhân gốc thực sự: Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]Và điều đó nói rằng bean ( FinancialAdminReceiptWebRequestBean) không thể được tìm thấy và giải quyết nullcho chắc chắn. Một lỗi phổ biến khác là, không khởi động lại máy chủ ứng dụng sau khi đổi tên hoặc di chuyển các lớp / giao diện (hoặc quên clean).
Roland

Câu trả lời:


238

1. Không thể truy cập mục tiêu, số nhận dạng 'bean' được giải quyết thành null

Điều này có nghĩa là bản thân bean được quản lý không thể tìm thấy bằng chính xác định danh đó (tên bean được quản lý) trong EL như vậy #{bean}.

Xác định nguyên nhân có thể được chia thành ba bước:

a. Ai đang quản lý đậu?
b. Tên đậu được quản lý (mặc định) là gì?
c. Lớp đậu ủng hộ ở đâu?

1a. Ai đang quản lý đậu?

Bước đầu tiên sẽ là kiểm tra khung quản lý bean nào chịu trách nhiệm quản lý thể hiện bean. Có phải là JSF thông qua @ManagedBean? Hay là CDI thông qua @Named? Hay là mùa xuân qua @Component? Bạn có thể chắc chắn rằng bạn không trộn nhiều chú thích cụ thể của khung quản lý bean trên cùng một lớp bean sao lưu không? Ví dụ @Named @Component, hoặc @Named @ManagedBean, hoặc @ManagedBean @Component. Cái này sai. Bean phải được quản lý bởi tối đa một khung quản lý bean và khung đó phải được cấu hình đúng. Nếu bạn chưa có ý tưởng nào để chọn, hãy tìm đến Backing bean (@ManagedBean) hoặc CDI Beans (@ Named)? tích hợp Spring JSF: làm thế nào để tiêm một thành phần / dịch vụ Spring trong bean được quản lý JSF?

Trong trường hợp đó là JSF , người quản lý bean thông qua @ManagedBean, thì bạn cần đảm bảo những điều sau:

  • Các faces-config.xmltuyên bố gốc tương thích với JSF 2.0. Vì vậy, các tập tin XSD và versionphải ít nhất định JSF 2.0 hoặc cao hơn và do đó không 1.x.

    <faces-config
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
        version="2.0">

    Đối với JSF 2.1, chỉ cần thay thế 2_02.0bằng 2_12.1tương ứng.

    Nếu bạn đang sử dụng JSF 2.2 trở lên, thì hãy đảm bảo rằng bạn đang sử dụng xmlns.jcp.orgkhông gian tên thay vì ở java.sun.comkhắp mọi nơi.

    <faces-config
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
        version="2.2">

    Đối với JSF 2.3, chỉ cần thay thế 2_22.2bằng 2_32.3tương ứng.

  • Bạn đã không vô tình nhập javax.annotation.ManagedBeanthay vì javax.faces.bean.ManagedBean. Xem ra với IDE tự động hoàn thành, Eclipse được biết là tự động đề xuất cái sai là mục đầu tiên trong danh sách.

  • Bạn đã không ghi đè mục nhập @ManagedBeankiểu JSF 1.x <managed-bean>trong faces-config.xmlcùng một lớp bean sao lưu cùng với tên bean được quản lý khác. Điều này sẽ có quyền ưu tiên hơn @ManagedBean. Đăng ký một bean được quản lý faces-config.xmllà không cần thiết kể từ JSF 2.0, chỉ cần xóa nó.
  • Đường dẫn lớp thời gian chạy của bạn sạch sẽ và không có các bản sao trong các JAR liên quan đến API của API. Hãy chắc chắn rằng bạn không trộn lẫn nhiều triển khai JSF (Mojarra và MyFaces). Đảm bảo rằng bạn không cung cấp tệp JAR API Java hoặc thậm chí Java EE khác cùng với ứng dụng web khi bộ chứa đích đã gói API JSF ra khỏi hộp. Xem thêm phần "Cài đặt JSF" trên trang wiki JSF của chúng tôi để biết hướng dẫn cài đặt JSF. Trong trường hợp bạn có ý định nâng cấp JSF được đóng gói từ WAR thay vì trong chính container, hãy đảm bảo rằng bạn đã hướng dẫn bộ chứa đích sử dụng API / hàm JSF được đóng gói WAR.
  • Nếu bạn đang đóng gói các hạt đậu được quản lý JSF trong JAR, thì hãy đảm bảo rằng JAR có ít nhất tương thích với JSF 2.0 /META-INF/faces-config.xml. Xem thêm Làm thế nào để tham khảo các bean được quản lý JSF được cung cấp trong tệp JAR?
  • Nếu bạn đang thực sự sử dụng JSF 1.x jurassic, và bạn không thể nâng cấp, sau đó bạn cần phải đăng ký đậu qua <managed-bean>trong faces-config.xmlthay vì @ManagedBean. Đừng quên sửa đường dẫn xây dựng dự án của bạn để bạn không còn thư viện JSF 2.x nữa (để @ManagedBeanchú thích sẽ không biên dịch thành công một cách khó hiểu).


Trong trường hợp đó là CDI , người quản lý bean thông qua @Named, thì bạn cần đảm bảo những điều sau:

  • CDI 1.0 (Java EE 6) yêu cầu một /WEB-INF/beans.xmltệp để bật CDI trong WAR. Nó có thể trống hoặc nó có thể có nội dung sau:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://java.sun.com/xml/ns/javaee" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    </beans>
  • CDI 1.1 (Java EE 7) không có bất kỳ beans.xmlhoặc một beans.xmltệp trống nào hoặc tương thích với CDI 1.0 ở trên beans.xmlsẽ hoạt động giống như CDI 1.0. Khi có một CDI 1.1 tương thích beans.xmlvới một rõ ràng version="1.1", sau đó nó sẽ theo mặc định chỉ đăng ký @Namedđậu với một CDI phạm vi chú thích rõ ràng như @RequestScoped, @ViewScoped, @SessionScoped, @ApplicationScoped, vv Trong trường hợp bạn có ý định đăng ký tất cả đậu như CDI quản lý đậu, ngay cả những người không có rõ ràng Phạm vi CDI, sử dụng CDI 1.1 dưới đây tương thích /WEB-INF/beans.xmlvới bean-discovery-mode="all"bộ (mặc định là bean-discovery-mode="annotated").

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                               http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
           version="1.1" bean-discovery-mode="all">
    </beans>
  • Khi sử dụng CDI 1.1+ với bean-discovery-mode="annotated"(mặc định), hãy đảm bảo rằng bạn không vô tình nhập phạm vi JSF như javax.faces.bean.RequestScopedthay vì phạm vi CDI javax.enterprise.context.RequestScoped. Xem ra với IDE tự động hoàn thành.

  • Khi sử dụng Mojarra 2.3.0-2.3.2 và CDI 1.1+ với bean-discovery-mode="annotated"(mặc định), thì bạn cần nâng cấp Mojarra lên phiên bản 2.3.3 hoặc mới hơn do lỗi . Trong trường hợp bạn không thể nâng cấp, sau đó bạn cần hoặc để thiết lập bean-discovery-mode="all"trong beans.xml, hoặc để đưa cụ JSF 2.3 @FacesConfigchú thích trên một lớp tùy ý trong WAR (thường một số loại của một ứng dụng scoped lớp khởi động).
  • Các container không phải Java EE như Tomcat và Jetty không được gửi kèm theo CDI. Bạn cần phải cài đặt nó bằng tay. Đó là một công việc nhiều hơn một chút so với chỉ thêm thư viện JAR (s). Đối với Tomcat, hãy đảm bảo rằng bạn làm theo hướng dẫn trong câu trả lời này: Cách cài đặt và sử dụng CDI trên Tomcat?
  • Classpath thời gian chạy của bạn sạch sẽ và không có các bản sao trong các JAR liên quan đến API CDI. Đảm bảo rằng bạn không trộn lẫn nhiều triển khai CDI (Weld, OpenWebBeans, v.v.). Đảm bảo rằng bạn không cung cấp tệp JAR CDI hoặc thậm chí Java EE khác cùng với ứng dụng web khi bộ chứa đích đã gói API CDI ra khỏi hộp.
  • Nếu bạn đang đóng gói các hạt đậu được quản lý CDI cho các khung nhìn JSF trong JAR, thì hãy đảm bảo rằng JAR có ít nhất một giá trị hợp lệ /META-INF/beans.xml(có thể được giữ trống).


Trong trường hợp đó là Spring , người quản lý bean thông qua @Component, thì bạn cần đảm bảo những điều sau:

  • Spring đang được cài đặt và tích hợp theo tài liệu của nó . Quan trọng, bạn cần ít nhất có cái này trong web.xml:

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    Và điều này trong faces-config.xml:

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
  • (trên đây là tất cả những gì tôi biết liên quan đến Mùa xuân - Tôi không làm Mùa xuân - thoải mái chỉnh sửa / nhận xét với các nguyên nhân liên quan đến Mùa xuân có thể xảy ra khác; ví dụ: một số sự cố liên quan đến cấu hình XML)


Trong trường hợp đó là một thành phần lặp lại của những người quản lý (lồng) đậu qua nó varthuộc tính (ví dụ như <h:dataTable var="item">, <ui:repeat var="item">, <p:tabView var="item">, vv) và bạn thực sự có một "Target Unreachable, nhận dạng 'mục' quyết tâm vô giá trị", thì bạn cần phải chắc chắn rằng những điều sau đây :

  • Điều #{item}này không được tham chiếu trong bindingattribtue của bất kỳ thành phần con nào. Điều này không chính xác vì bindingthuộc tính chạy trong thời gian xây dựng chế độ xem, không phải trong thời gian hiển thị chế độ xem. Hơn nữa, về mặt vật lý chỉ có một thành phần trong cây thành phần được sử dụng lại đơn giản trong mỗi vòng lặp. Nói cách khác, bạn thực sự nên sử dụng binding="#{bean.component}"thay vì binding="#{item.component}". Nhưng tốt hơn nhiều là loại bỏ hoàn toàn bining thành phần đậu và điều tra / hỏi phương pháp thích hợp cho vấn đề bạn nghĩ để giải quyết theo cách này. Xem thêm Làm thế nào để thuộc tính 'ràng buộc' hoạt động trong JSF? Nên sử dụng khi nào và như thế nào?


1b. Tên đậu được quản lý (mặc định) là gì?

Bước thứ hai sẽ là kiểm tra tên đậu được quản lý đã đăng ký. JSF và Spring sử dụng các quy ước tuân thủ đặc tả JavaBeans trong khi CDI có các ngoại lệ tùy thuộc vào phiên bản / hàm CDI.

  • Một FooBeanlớp đậu ủng hộ như dưới đây,

    @Named
    public class FooBean {}

    trong tất cả các khung quản lý bean sẽ có một tên bean được quản lý mặc định #{fooBean}, theo đặc tả của JavaBeans.

  • Một FOOBeanlớp đậu ủng hộ như dưới đây,

    @Named
    public class FOOBean {}

    có tên lớp không đủ tiêu chuẩn bắt đầu bằng ít nhất hai chữ viết hoa trong JSF và Spring có tên bean được quản lý mặc định của chính xác tên lớp không đủ tiêu chuẩn #{FOOBean}, cũng tuân thủ đặc tả JavaBeans. Trong CDI, đây cũng là trường hợp trong các phiên bản Weld được phát hành trước tháng 6 năm 2015, nhưng không phải trong các phiên bản Weld được phát hành sau tháng 6 năm 2015 (2.2,14 / 2.3.0.B1 / 3.0.0.A9) cũng như trong OpenWebBeans do sự giám sát trong Thông số CDI . Trong các phiên bản Weld đó và trong tất cả các phiên bản OWB, nó chỉ có ký tự đầu tiên được hạ thấp #{fOOBean}.

  • Nếu bạn đã chỉ định rõ ràng một tên bean được quản lý foonhư dưới đây,

    @Named("foo")
    public class FooBean {}

    hoặc tương đương với @ManagedBean(name="foo")hoặc @Component("foo"), sau đó nó sẽ chỉ có sẵn bằng #{foo}và do đó không bằng #{fooBean}.


1c. Lớp đậu ủng hộ ở đâu?

Bước thứ ba sẽ là kiểm tra lại nếu lớp bean dự phòng ở đúng vị trí trong tệp WAR được xây dựng và triển khai. Hãy chắc chắn rằng bạn đã thực hiện đầy đủ sạch, xây dựng lại, triển khai lại và khởi động lại dự án và máy chủ trong trường hợp bạn thực sự bận viết mã và nhấn F5 một cách thiếu kiên nhẫn trong trình duyệt. Nếu vẫn vô ích, hãy để hệ thống xây dựng tạo tệp WAR, sau đó bạn trích xuất và kiểm tra bằng công cụ ZIP. Biên soạn.class của lớp bean sao lưu phải nằm trong cấu trúc gói của nó trong /WEB-INF/classes. Hoặc, khi nó được đóng gói như một phần của mô-đun JAR, JAR chứa .classtệp đã biên dịch phải nằm trong /WEB-INF/libđó, do đó không phải là EAR /libhoặc các nơi khác.

Nếu bạn đang sử dụng Eclipse, hãy đảm bảo rằng lớp bean dự phòng có trong srcvà do đó không WebContent , và đảm bảo rằng Project> Build Automatic được bật. Nếu bạn đang sử dụng Maven, hãy đảm bảo rằng lớp bean hậu thuẫn nằm trong src/main/javavà do đó không nằm trong src/main/resourceshoặc src/main/webapp.

Nếu bạn đóng gói ứng dụng web như một phần của EAR với EJB + WAR (s), thì bạn cần đảm bảo rằng các lớp bean sao lưu nằm trong mô-đun WAR và do đó không phải trong mô-đun EAR cũng như mô-đun EJB. Tầng doanh nghiệp (EJB) phải không có bất kỳ tạo phẩm nào liên quan đến tầng web (WAR), để tầng doanh nghiệp có thể được sử dụng lại trên nhiều tầng web khác nhau (JSF, JAX-RS, JSP / Servlet, v.v.).


2. Không thể truy cập mục tiêu, 'thực thể' được trả về null

Điều này sôi xuống với tài sản lồng nhauentity như trong #{bean.entity.property}trả lại null. Điều này thường chỉ hiển thị khi JSF cần đặt giá trị cho propertythông qua một thành phần đầu vào như bên dưới, trong khi #{bean.entity}thực tế được trả về null.

<h:inputText value="#{bean.entity.property}" />

Bạn cần đảm bảo rằng bạn đã chuẩn bị trước thực thể mô hình trong một @PostConstructhoặc <f:viewAction>phương thức hoặc có lẽ là một add()phương thức hành động trong trường hợp bạn đang làm việc với danh sách CRUD và / hoặc hộp thoại trên cùng một chế độ xem.

@Named
@ViewScoped
public class Bean {

    private Entity entity; // +getter (setter is not necessary).

    @Inject
    private EntityService entityService;

    @PostConstruct
    public void init() {
        // In case you're updating an existing entity.
        entity = entityService.getById(entityId);

        // Or in case you want to create a new entity.
        entity = new Entity();
    }

    // ...
}

Như tầm quan trọng của @PostConstruct; làm điều này trong một hàm tạo thông thường sẽ thất bại trong trường hợp bạn đang sử dụng khung quản lý bean sử dụng proxy , chẳng hạn như CDI. Luôn luôn sử dụng @PostConstructđể hook khi khởi tạo thể hiện bean được quản lý (và sử dụng @PreDestroyđể hook khi phá hủy thể hiện bean được quản lý). Ngoài ra, trong một hàm tạo, bạn sẽ không có quyền truy cập vào bất kỳ phụ thuộc được chèn nào, hãy xem NullPulumException trong khi cố gắng truy cập @Inject bean trong hàm tạo .

Trong trường hợp entityIdđược cung cấp qua <f:viewParam>, bạn cần sử dụng <f:viewAction>thay vì @PostConstruct. Xem thêm Khi nào nên sử dụng f: viewAction / preRenderView so với PostConstruct?

Bạn cũng cần đảm bảo rằng bạn bảo tồn nullmô hình không trong quá trình postback trong trường hợp bạn chỉ tạo nó trong một add()phương thức hành động. Dễ nhất là đặt bean trong phạm vi xem. Xem thêm Làm thế nào để chọn phạm vi đậu đúng?


3. Không thể truy cập mục tiêu, 'null' được trả về null

Điều này thực sự có cùng nguyên nhân với # 2, chỉ có việc triển khai EL (cũ hơn) được sử dụng có phần lỗi trong việc giữ tên thuộc tính để hiển thị trong thông báo ngoại lệ, cuối cùng được hiển thị không chính xác là 'null'. Điều này chỉ làm cho việc gỡ lỗi và sửa lỗi khó hơn một chút khi bạn có khá nhiều thuộc tính lồng nhau như vậy#{bean.entity.subentity.subsubentity.property} .

Giải pháp vẫn giống nhau: đảm bảo rằng thực thể lồng nhau trong câu hỏi không null, trong tất cả các cấp.


4. Không thể truy cập mục tiêu, '' 0 '' được trả về null

Điều này cũng có cùng nguyên nhân với # 2, chỉ có việc triển khai EL (cũ hơn) đang được sử dụng là lỗi trong việc hình thành thông báo ngoại lệ. Điều này chỉ hiển thị khi bạn sử dụng ký hiệu dấu ngoặc []trong EL như trong #{bean.collection[index]}đó #{bean.collection}bản thân nó là không rỗng, nhưng mục tại chỉ mục được chỉ định không tồn tại. Một thông điệp như vậy sau đó phải được hiểu là:

Không thể truy cập mục tiêu, 'bộ sưu tập [0]' trả về null

Giải pháp cũng giống như # 2: đảm bảo rằng bộ sưu tập có sẵn.


5. Không thể truy cập mục tiêu, 'ngoặcSuffix' trả về null

Điều này thực sự có cùng nguyên nhân với số 4, chỉ có việc triển khai EL (cũ hơn) được sử dụng có phần lỗi trong việc duy trì chỉ số lặp để hiển thị trong thông báo ngoại lệ, cuối cùng được hiển thị không chính xác là 'ngoặcSuffix' thực sự là ký tự ]. Điều này chỉ làm cho việc gỡ lỗi và sửa lỗi khó hơn một chút khi bạn có nhiều mục trong bộ sưu tập.


Các nguyên nhân có thể khác của javax.el.PropertyNotFoundException:


Tôi đang chạy vào số 3. #{bean.entity.property}không xuất giá trị nhưng <p:selectBooleanCheckbox value="#{bean.entity.property}"/>không thành công. Boolean của tôi không có setter. Một tính chất nguyên trên cùng đối tượng thực hiện công việc khi được sử dụng trong một lĩnh vực đầu vào. Có ý kiến ​​gì không?
Jasper de Vries

Một điều đáng để kiểm tra là đảm bảo rằng các triển khai JSF và CDI của bạn được tích hợp, đó là vấn đề của tôi: stackoverflow.com/questions/44064995/ Thẻ
Jerry B. no.1 intern

Theo :: Target Unreachable, identifier 'bean' resolved to nullTrong các dự án maven đa mô-đun (chứa các mô-đun cho ejb, web, tai), hãy đảm bảo mô-đun web của bạn khai báo một phụ thuộc vào mô-đun ejb của bạn. Nếu không có điều đó thì @ManagedBeankhông thể giải quyết bằng JSF2.0 và bạn phải khai báo chúng faces-config.xml. Mất khoảng hai giờ để tôi nhận ra rằng tôi đã không tuyên bố sự phụ thuộc để đưa ejb vào mô-đun web của mình (chỉ có ejb và web trong tai tôi)
bish

1
@bish Các tạo phẩm Front-end như @ManagedBeancác lớp không thuộc lớp dịch vụ (dự án EJB) ở vị trí đầu tiên. Xem thêm stackoverflow.com/questions/13011392/jsf-service-layer
BalusC

Có thể một hạt đậu không được tuần tự hóa cũng dẫn đến lỗi này (như tôi nghi ngờ là trường hợp trong stackoverflow.com/questions/47533584/iêu (nhưng hiện tại không thể thử bản thân mình))
Kukeltje

6

Đối với những người vẫn đang bị mắc kẹt ...

Sử dụng NetBeans 8.1 và GlassFish 4.1 với CDI, vì một số lý do tôi chỉ gặp sự cố này cục bộ chứ không phải trên máy chủ từ xa. Thủ thuật đã làm gì:

-> sử dụng javaee-web-api 7.0 thay vì phiên bản pom mặc định do NetBeans cung cấp, đó là javaee-web-api 6.0, vì vậy:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
    <type>jar</type>
</dependency>

-> tải lên javaee-web-api-7.0.jar này dưới dạng lib trên máy chủ (thư mục lib trong thư mục domain1) và khởi động lại máy chủ.


Điều này khớp với "Đường dẫn lớp thời gian chạy của bạn sạch sẽ và không có các bản sao trong các JAR liên quan đến API CDI." Nói cách khác, classpath thời gian chạy của bạn theo một cách nào đó đã bị rối với các thư viện trùng lặp.
BalusC

Thật vậy, và câu trả lời của bạn đã giúp tôi xác định vấn đề có thể xảy ra mà tôi nên tập trung vào ;-) Chỉ cần chứng minh ở đây các chi tiết về giải pháp cụ thể của tôi, nó có thể tiết kiệm thời gian cho một vài người dùng.
seinecle 6/2/2016

1

Tôi quyết định chia sẻ phát hiện của mình về lỗi này sau khi tự giải quyết.

Trước hết, các giải pháp BalusC cần được thực hiện nghiêm túc nhưng sau đó, có một vấn đề khác có thể xảy ra ở Netbeans là nhận thức được đặc biệt là khi xây dựng Dự án Ứng dụng Doanh nghiệp (EAR) bằng Maven.

Netbeans tạo, tệp POM gốc , dự án EAR , dự án EJBdự án WAR . Mọi thứ khác trong dự án của tôi đều ổn và tôi gần như cho rằng vấn đề là do lỗi GlassFish 4.0 (tôi phải cài đặt và cắm nó vào Netbeans) vì GlassFish 4.1 có lỗi Weld CDI khiến cho GlassFish 4.1 bị nhúng trong Netbeans 8.0. 2 không thể sử dụng ngoại trừ thông qua một bản vá.

Giải pháp:

Để giải quyết "Target Unreachable, nhận dạng 'đậu' quyết tâm vô giá trị" sai sót

Tôi bấm chuột phải vào dự án POM gốc và chọn Thuộc tính . Hộp thoại Thuộc tính dự án xuất hiện, nhấp vào "Nguồn", bạn sẽ ngạc nhiên khi thấy " Định dạng nguồn / nhị phân " được đặt thành 1.5 và " Mã hóa " được đặt thành Windows 1250. Thay đổi " Định dạng nguồn / nhị phân " thành 1.6 0r 1.7, tùy theo trường hợp nào bạn thích làm cho CDI dự án của bạn tuân thủ và " Mã hóa " thành UTF-8.

Thực hiện tương tự cho tất cả các tiểu dự án khác (EAR, EJB, WAR) nếu chúng chưa có khả năng tương thích. Chạy dự án của bạn và bạn sẽ không gặp lại lỗi đó.

Tôi hy vọng điều này sẽ giúp ai đó có lỗi tương tự.


Tôi thấy câu trả lời của bạn khó hiểu nói chung (với nhiều loại thông tin không liên quan trực tiếp) và cả định dạng mã hóa / nhị phân và mã hóa đóng một vai trò trong vấn đề này. Bạn có chắc chắn thay đổi điều này không chỉ kích hoạt việc xây dựng lại tốt / đầy đủ để giải quyết vấn đề?
Kukeltje

1

Tôi quyết định chia sẻ giải pháp của mình, bởi vì mặc dù nhiều câu trả lời được cung cấp ở đây rất hữu ích, tôi vẫn gặp vấn đề này. Trong trường hợp của tôi, tôi đang sử dụng JSF 2.3, jdk10, jee8, cdi 2.0 cho dự án mới của mình và tôi đã chạy ứng dụng của mình trên wildfly 12, khởi động máy chủ với tham số độc lập.sh -Dee8.preview.mode = true như được đề xuất trên trang web wildfly . Vấn đề với "bean được giải quyết thành null đã biến mất sau khi tải wildfly 13. Tải lên chính xác cùng một cuộc chiến với wildfly 13 khiến tất cả đều hoạt động.


1

Tôi bị kẹt vì lỗi này vì trong lớp có @SpringBootApplicationtôi quên chỉ định tên gói của bộ điều khiển.

Tôi muốn cụ thể hơn lần này chỉ ra các thành phần mà Spring phải quét, thay vì cấu hình gói cơ sở.

Nó là như thế này:

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service"})

Nhưng hình thức chính xác là một trong những điều sau đây:

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service", "br.com.company.project.controller"})

@ComponentScan(basePackages = {"br.com.company.project")

Tôi quyết định chia sẻ giải pháp của mình, bởi vì mặc dù câu trả lời đúng là rất toàn diện, nhưng nó không bao gồm lỗi này (ngu ngốc) :)


0

Trong trường hợp của tôi, tôi đã phạm một lỗi chính tả trong @Named ("beanName"), nó được giả sử là "beanName", nhưng tôi đã viết "beanNam" chẳng hạn.


0

Tôi đang sử dụng wildfly 10 cho javaee container. Tôi đã gặp phải sự cố "Không thể truy cập mục tiêu," thực thể "trả về null". Cảm ơn đề xuất của BalusC nhưng vấn đề của tôi trong số các giải pháp đã giải thích. Vô tình sử dụng "nhập com.sun.istack.logging.Logger;" thay vì "nhập org.jboss.logging.Logger;" gây ra CDI thực hiện JSF EL. Hy vọng nó sẽ giúp cải thiện giải pháp.


0

Tôi đã từng gặp vấn đề tương tự. Giải pháp hóa ra đơn giản hơn nhiều. Dường như một datable muốn phương thức ở dạng getter, tức là getSomeMethod (), không chỉ someMethod (). Trong trường hợp của tôi trong dữ liệu, tôi đã gọi findResults. Tôi đã thay đổi phương thức trong bean hậu thuẫn của mình thành getFindResults () và nó đã hoạt động.

Một CommandButton hoạt động tìm mà không có get được phục vụ để làm cho nó chỉ khó hiểu hơn.


0

Đối với số 2, trong trường hợp của tôi, nó đã sống lại một cách kỳ diệu sau khi thay thế

<body>

gắn thẻ với

<h:body>

Sau khi thực hiện một số dự án JSF (đơn giản hơn, trung thực hơn), tôi không thể nhớ đã làm bất cứ điều gì khác biệt khi thiết lập nó và tôi đã gặp loại lỗi này lần đầu tiên. Tôi đã tạo một trang đăng nhập rất cơ bản (tên người dùng, mật khẩu, người dùng Bean ...) và thiết lập mọi thứ như bình thường. Sự khác biệt duy nhất tôi phát hiện là các thẻ nói trên. Có lẽ ai đó thấy điều này hữu ích.


0

Vấn đề trong trường hợp của tôi là tôi đã bao gồm một hàm tạo lấy tham số nhưng không phải là hàm tạo rỗng với chú thích Tiêm, như vậy.

@Inject public VisitorBean() {}

Tôi chỉ thử nghiệm nó mà không có bất kỳ nhà xây dựng nào và điều này dường như cũng hoạt động.


0

Đối với 1. chủ đề ( Không thể truy cập mục tiêu, số nhận dạng 'bean' được giải quyết thành null );

Tôi đã kiểm tra các câu trả lời có giá trị @BalusC và các bộ chia sẻ khác nhưng tôi vượt quá vấn đề như thế này trong kịch bản của mình. Sau khi tạo một xhtml mới với tên khác và tạo lớp bean với tên khác thì tôi đã viết (không sao chép-dán) các mã từng bước đến lớp bean mới và tệp xhtml mới.


0

Khi tôi xóa AnnotationConfigWebApplicationContext bối cảnh param khỏi tệp web.xml Đây là công việc

Nếu bạn đã có thông số như hình dưới đây, bạn phải xóa nó khỏi tệp web.xml

<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
  </param-value>
</context-param> 

quan tâm để giải thích tại sao điều này giải quyết nó? Hay đúng hơn là tại sao nó lại gây ra vấn đề?
Kukeltje

-1

Làm việc với JSF theo kiểu cũ Bạn phải xác định bean được quản lý trong tệp bean-config.xml (nằm trong thư mục WEB-INF) và tạo một tham chiếu đến nó trong tệp web.xml , theo cách này:

bean-config.xml

<managed-bean>
  <managed-bean-name>"the name by wich your backing bean will be referenced"</managed-bean-name>
  <managed-bean-class>"your backing bean fully qualified class name"</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>    
</managed-bean>

(Tôi đã thử sử dụng các phạm vi khác, nhưng ...)

web.xml

<context-param>
  <param-name>javax.faces.CONFIG_FILES</param-name>
  <param-value>"/WEB-INF/beans-config.xml</param-value>
</context-param>

-2

Một manh mối khác: Tôi đã sử dụng JSF và thêm các phụ thuộc mvn: com.sun.faces jsf-api 2.2.11

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.11</version>
    </dependency>

Sau đó, tôi đã cố gắng thay đổi thành Primefaces và thêm phụ thuộc vào primefaces:

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>6.0</version>
</dependency>

Tôi đã thay đổi xhtml của mình từ h: thành p:, thêm xmlns: p = "http://primefaces.org/ui vào mẫu. Chỉ với JSF, proyect đã chạy ổn và được quản lý đạt được ok. Khi tôi thêm Primefaces Tôi đã nhận được đối tượng không thể truy cập được cài đặt proyect. Tất cả đều ổn từ thời điểm này. Hy vọng rằng sẽ giúp.


2
Giả định của bạn về nguyên nhân của vấn đề không có ý nghĩa. PrimeFaces hoàn toàn không phải là một triển khai JSF. Điều này phù hợp với yêu cầu "Đường dẫn lớp thời gian chạy của bạn sạch sẽ và không có các bản sao trong các JAR liên quan đến API CDI." Nói cách khác, đường dẫn lớp thời gian chạy của bạn theo một cách nào đó đã bị rối với các thư viện trùng lặp và PrimeFaces chỉ phóng to nó, không gây ra nó.
BalusC

-3

EL diễn giải $ {bean.propretyName} như được mô tả - propertyName trở thành getPropertyName () với giả định bạn đang sử dụng các phương thức rõ ràng hoặc ẩn để tạo getter / setters

Bạn có thể ghi đè hành vi này bằng cách xác định rõ ràng tên là hàm: $ {bean.methodName ()} Điều này gọi trực tiếp phương thức hàm Name () mà không cần sửa đổi.

Không phải lúc nào người truy cập của bạn cũng được đặt tên là "có được ...".


1
Đây không phải là thực hành chính xác và điều này làm cho không thể gọi đúng setters phía sau các thành phần đầu vào. Đây cũng không thể là nguyên nhân của ngoại lệ nói trên. Điều này sẽ chỉ gây ra ngoại lệ đã nói mà bạn đã mắc lỗi khi tham chiếu một thuộc tính trong biểu thức phương thức hành động như action="#{bean.property}"thay vì action="#{bean.method}".
BalusC

đáng chú ý, trong thế giới của java hiện đại với lập trình chức năng, "thực hành đúng" này đang thay đổi. Xem dev.to/scottshipp/ và các tài liệu tham khảo. Lưu ý rằng Lombok có cài đặt "thông thạo" trong đó get / set không được thêm vào. Công ty chúng tôi có 1000 kỹ sư dường như có một cái nhìn khác về thực tiễn hiện tại.
sdw

1
Tôi nghĩ rằng bạn và 1000 kỹ sư của bạn là những đặc tính khó hiểu với các phương thức.
BalusC

Thực hành thiết kế này đang trở nên phổ biến trong các ứng dụng quy mô lớn với độ đồng thời rất cao. Tôi đề nghị rằng downvote của bạn dựa trên một quan điểm về nguyên tắc thiết kế, thay vì giá trị của câu trả lời trong việc giúp cộng đồng rộng lớn của chúng tôi theo dõi một lỗi tiềm ẩn.
sdw

1
Huh? Xin lỗi, tôi không thể bỏ qua ấn tượng rằng bạn không biết bạn đang nói về cái gì.
BalusC

-3

Trong trường hợp của tôi "el-ri-1.0.jar" đã bị mất.


1
Thông thường bạn không cần nó chút nào, vì vậy có vấn đề khác. Hầu hết có lẽ là một classpath bẩn. Bạn nên khắc phục điều đó thay vì làm cho nó trở nên tồi tệ hơn trong thời gian dài bằng cách thêm các thư viện được cho là đã được cung cấp bởi máy chủ.
BalusC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.