Javax.el.PropertyNotFoundException'ı tanımlama ve çözme: Hedefe ulaşılamıyor


127

EL'de bu şekilde yönetilen bir fasulyeye başvurmaya çalışırken #{bean.entity.property}, bazen bir javax.el.PropertyNotFoundException: Target Unreachableistisna atılır, genellikle bir bean özelliği ayarlanacağı zaman veya bir bean eylemi çağrılacağı zaman.

Beş farklı tür mesaj var gibi görünüyor:

  1. Hedef Ulaşılamaz, tanımlayıcı 'bean' boş olarak çözüldü
  2. Ulaşılamayan Hedef, "varlık" null döndürdü
  3. Ulaşılamayan Hedef, 'boş' null döndürdü
  4. Hedef Ulaşılamıyor, "0" null döndürdü
  5. Hedef Ulaşılamaz, 'BracketSuffix' boş döndürdü

hepsi ne anlama geliyor? Nasıl neden oluyorlar ve nasıl çözülmeleri gerekiyor?




Sonra birden, bu ... benim için kırdı ben bu sabit , javax.faces.jar (Mojarra) silerek, sunucuyu durdurma benim yapı dizini silme ve benim WebLogic serverını temizleyerek (benim fasulye tanımıyor) \ tmp \ bulunuyor ve Etki Alanındaki \ cache \ klasörleri, sunucuyu yeniden başlatıyor, javax'ı bulamadığı için yayınlamaya çalışıyor ve başarısız oluyor, SVN - javax.faces.jar silme işlemini geri döndürüyor (böylece onu dışarı taşıyabilir ve sonra geri taşıyın) ve yayınlayın. Birdenbire tekrar çalıştı ...
Andrew

Dağıtım sırasında meydana gelen ilgili günlük mesajları için her zaman yukarıdaki birkaç satırı kontrol edin, işte asıl temel neden buydu: Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]Ve söz konusu bean ( FinancialAdminReceiptWebRequestBean) kesinlikle bulunamadı ve çözülemedi null. Diğer bir yaygın hata da, örneğin sınıfları / arayüzleri yeniden adlandırdıktan veya taşıdıktan (veya unuttuktan clean) sonra uygulama sunucusunu yeniden başlatmamaktır .
Roland

Yanıtlar:


239

1. Ulaşılamaz hedef, tanımlayıcı "bean" boş olarak çözüldü

Bu, yönetilen fasulye örneğinin kendisinin EL'de tam olarak bu tanımlayıcı (yönetilen fasulye adı) tarafından bulunamamasıyla sonuçlanır. #{bean} .

Nedeni belirlemek üç adıma ayrılabilir:

a. Fasulyeyi kim yönetiyor?
b. (Varsayılan) yönetilen fasulye adı nedir?
c. Destekleyici fasulye sınıfı nerede?

1 A. Fasulyeyi kim yönetiyor?

İlk adım, fasulye örneğini yönetmekten hangi fasulye yönetim çerçevesinin sorumlu olduğunu kontrol etmek olacaktır. Öyle mi JSF aracılığıyla @ManagedBean? Yoksa CDI yoluyla @Namedmı? Ya öyle Bahar aracılığıyla@Component mı? Aynı destekleyici fasulye sınıfında birden fazla fasulye yönetimi çerçevesine özgü ek açıklamayı karıştırmadığınızdan emin olabilir misiniz? Örneğin @Named @Component, veya @Named @ManagedBean, veya @ManagedBean @Component. Bu yanlış. Çekirdek en fazla bir çekirdek yönetim çerçevesi tarafından yönetilmeli ve bu çerçeve uygun şekilde yapılandırılmalıdır. Hangisini seçeceğiniz konusunda zaten bir fikriniz yoksa, Backingbean'lara (@ManagedBean) veya CDI Beans'e (@Named) gidin? ve Spring JSF entegrasyonu: JSF tarafından yönetilen çekirdeğe bir Spring bileşeni / hizmeti nasıl enjekte edilir?

Durumda bulunuyor JSF aracılığıyla fasulye yönettiğini @ManagedBean, o zaman emin aşağıdakilerden yapmak gerekir:

  • faces-config.xmlKök beyanı JSF 2.0 ile uyumludur. Yani XSD dosyası ve versionzorunluluk en az JSF 2.0 veya daha yüksek ve dolayısıyla değil 1.x belirtmek

    <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">

    JSF 2.1 için, 2_0 ve 2.0ile 2_1ve 2.1sırasıyla.

    JSF 2.2 veya üzerindeyseniz, kullandığınızdan emin olun. xmlns.jcp.orgjava.sun.com üzerindeyseniz, her yerde yerine ad alanları .

    <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">

    JSF 2.3 için, değiştirin 2_2ve2.2 ile 2_3ve 2.3sırasıyla.

  • Yanlışlıkla içe aktarmadınız javax.annotation.ManagedBean yerine aktarmadınızjavax.faces.bean.ManagedBean . IDE otomatik tamamlama ile dikkat edin, Eclipse'in listedeki ilk öğe olarak yanlış olanı otomatik olarak önerdiği bilinmektedir.

  • İçinde @ManagedBeanJSF 1.x stili <managed-bean>girişi geçersiz kılmadınızfaces-config.xmlAynı destek fasulye sınıfında farklı bir yönetilen fasulye adıyla birlikte . Bu bir önceliğe sahip olacak @ManagedBean. faces-config.xmlJSF 2.0'dan beri yönetilen bir bean'i kaydetmek gerekli değildir, onu kaldırmanız yeterlidir.
  • Çalışma zamanı sınıf yolunuz temizdir ve JSF API ile ilgili JAR'larda kopyalar içermez. Birden çok JSF uygulamasını (Mojarra ve MyFaces) karıştırmadığınızdan emin olun. Hedef kapsayıcı zaten JSF API'yi kutudan çıkardığında web uygulaması boyunca başka bir JSF veya hatta Java EE API JAR dosyası sağlamadığınızdan emin olun. Ayrıca JSF wiki sayfamızın "JSF'yi Yükleme" bölümüne bakın.JSF kurulum talimatları için JSF . Konteynerle paketlenmiş JSF'yi konteynerin kendisi yerine WAR'dan yükseltmeyi planlıyorsanız, hedef konteynere WAR ile paketlenmiş JSF API / impl kullanma talimatı verdiğinizden emin olun.
  • JSF tarafından yönetilen çekirdekleri bir JAR'da paketliyorsanız, JAR'ın en az JSF 2.0 uyumlu olduğundan emin olun. /META-INF/faces-config.xml . Ayrıca bkz . Bir JAR dosyasında sağlanan JSF tarafından yönetilen çekirdeklere nasıl başvurulur?
  • Eğer ediyorsanız aslında jurassic JSF 1.x kullanılarak ve Yükseltemiyorsanız, o zaman aracılığıyla fasulye kaydetmeniz gerekir <managed-bean>içinde faces-config.xmlyerine @ManagedBean. Artık JSF 2.x kitaplıklarınız olmayacak şekilde proje oluşturma yolunuzu düzeltmeyi unutmayın (böylece @ManagedBeanek açıklama kafa karıştırıcı bir şekilde başarılı bir şekilde derlenmesin).


Durumda bulunuyor CDI aracılığı fasulye yönettiğini @Named, o zaman emin aşağıdakilerden yapmak gerekir:

  • CDI 1.0 (Java EE 6), /WEB-INF/beans.xmlWAR'da CDI'yı etkinleştirmek için bir dosya gerektirir . Boş olabilir veya yalnızca aşağıdaki içeriğe sahip olabilir:

    <?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>
  • Herhangi bir beans.xmlveya boş bir beans.xmldosya olmadan veya yukarıdaki CDI 1.0 uyumlu CDI 1.1 (Java EE 7) , CDI 1.0 beans.xmlile aynı şekilde davranacaktır. Bir CDI 1.1 uyumlu olmadığı zaman beans.xmlaçık olarak version="1.1", o zaman varsayılan olarak yalnızca kaydeder @Namedfasulye ile gibi açık bir CDI kapsamı açıklama @RequestScoped, @ViewScoped, @SessionScoped, @ApplicationScoped, vb Eğer hatta açık bir olmadan, CDI fasulye yönetilen gibi tüm fasulye kayıt niyetinde CDI kapsamı, CDI uyumlu 1.1 altında kullanmak /WEB-INF/beans.xmlile bean-discovery-mode="all"(varsayılan kümesi 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>
  • bean-discovery-mode="annotated"(Varsayılan) ile CDI 1.1+ kullanırken , yanlışlıkla bir JSF kapsamını içe aktarmadığınızdan emin olun.javax.faces.bean.RequestScoped kullanırken, bir CDI kapsamı yerinejavax.enterprise.context.RequestScoped . IDE otomatik tamamlama ile dikkat edin.

  • Mojarra 2.3.0-2.3.2 ve CDI 1.1+ bean-discovery-mode="annotated"(varsayılan) ile kullanıldığında, bir hata nedeniyle Mojarra'yı 2.3.3 veya daha yenisine yükseltmeniz gerekir . Yükseltemiyorsanız, ikisinden birini ayarlamanız gerekir bean-discovery-mode="all".beans.xml veya MTU 2.3 belirli koymak için @FacesConfig(genellikle bir uygulamanın bir çeşit başlangıç sınıfı kapsamlı) WAR keyfi sınıfına ek açıklama.
  • Tomcat ve Jetty gibi Java dışı EE kapsayıcıları CDI paketiyle birlikte gönderilmez. Manuel olarak kurmanız gerekir. Kitaplık JAR (lar) ını eklemekten biraz daha fazla iş. Tomcat için, şu yanıtta verilen talimatları izlediğinizden emin olun: Tomcat'e CDI nasıl kurulur ve kullanılır?
  • Çalışma zamanı sınıf yolunuz temizdir ve CDI API ile ilgili JAR'larda kopya içermez. Birden fazla CDI uygulamasını (Weld, OpenWebBeans, vb.) Karıştırmadığınızdan emin olun. Hedef kapsayıcı zaten CDI API'sini kutudan paketlediğinde web uygulaması boyunca başka bir CDI veya hatta Java EE API JAR dosyası sağlamadığınızdan emin olun.
  • Bir JAR'da JSF görünümleri için CDI tarafından yönetilen çekirdekleri paketliyorsanız, JAR'da en az bir geçerli /META-INF/beans.xml(boş tutulabilir) olduğundan emin olun .


Fasulyeyi yönetenin Bahar olması durumunda @Component, aşağıdakilerden emin olmanız gerekir:

  • Yay, dokümantasyonuna göre kurulmakta ve entegre edilmektedir . Daha da önemlisi, en azından şunlara sahip olmanız gerekir web.xml:

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

    Ve bu da faces-config.xml:

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
  • (Bahar ile ilgili bildiğim her şey yukarıda - Bahar yapmıyorum - diğer olası Bahar ile ilgili nedenleri düzenlemek / yorum yapmaktan çekinmeyin; örneğin, XML yapılandırmasıyla ilgili bazı sorunlar)


Durumda bir var tekrarlayıcı bileşeni onun aracılığıyla (iç içe) fasulye yönettiğini var(örn özniteliği <h:dataTable var="item">, <ui:repeat var="item">, <p:tabView var="item">, vs) ve aslında var bir "Hedef ulaşılamaz, tanımlayıcı 'madde' null çözülmesi", o zaman aşağıdakilerden emin olmak gerekir :

  • #{item}Başvuruda bulunulan bindingherhangi bir çocuk bileşeninin attribtue. Bu, bindingöznitelik görünüm oluşturma sırasında değil, görünüm oluşturma zamanında çalıştığından yanlıştır . Dahası, bileşen ağacında fiziksel olarak her yineleme turunda basitçe yeniden kullanılan tek bir bileşen vardır. Başka bir deyişle, aslında binding="#{bean.component}"yerine kullanmalısınız binding="#{item.component}". Ancak çok daha iyisi, bileşen gruplamadan tamamen kurtulmak ve bu şekilde çözmeyi düşündüğünüz problem için uygun yaklaşımı araştırmak / sormaktır. Ayrıca bkz . 'Bağlama' özelliği JSF'de nasıl çalışır? Ne zaman ve nasıl kullanılmalıdır?


1b. (Varsayılan) yönetilen fasulye adı nedir?

İkinci adım, kayıtlı yönetilen fasulye adının kontrol edilmesidir. JSF ve Spring kullanım kuralları JavaBeans şartnamesine uygundur , CDI ise CDI impl / versiyonuna bağlı istisnalara sahiptir.

  • FooBeanAşağıdaki gibi bir destek fasulye sınıfı,

    @Named
    public class FooBean {}

    tüm fasulye yönetim çerçevelerinde, #{fooBean}JavaBeans spesifikasyonuna göre varsayılan bir yönetilen fasulye adı olacaktır .

  • FOOBeanAşağıdaki gibi bir destek fasulye sınıfı,

    @Named
    public class FOOBean {}

    Niteliksiz sınıf adı en az iki büyük harfle başlayan JSF ve Spring'de, tam olarak nitelenmemiş sınıf adına sahip varsayılan bir yönetilen fasulye adı olacaktır #{FOOBean}, ayrıca JavaBeans belirtimine uygundur. CDI'da, Haziran 2015'ten önce yayınlanan Weld sürümlerinde de durum söz konusudur, ancak Haziran 2015'ten sonra yayınlanan Weld sürümlerinde (2.2.14 / 2.3.0.B1 / 3.0.0.A9) veya bir gözetim nedeniyle OpenWebBeans'te CDI özellikleri . Bu Weld sürümlerinde ve tüm OWB sürümlerinde, yalnızca ilk karakter küçük harflidir #{fOOBean}.

  • Aşağıdaki gibi açıkça bir yönetilen fasulye adı belirlediyseniz foo,

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

    veya eşdeğer ile @ManagedBean(name="foo")veya @Component("foo"), o zaman sadece kadar ulaşılabilir #{foo}ve böylece değil tarafından #{fooBean}.


1c. Destekleyici fasulye sınıfı nerede?

Üçüncü adım, destekleyici fasulye sınıfının oluşturulan ve konuşlandırılan WAR dosyasında doğru yerde olup olmadığını iki kez kontrol etmek olacaktır. Gerçekten kod yazmakla meşgul olmanız ve tarayıcıda sabırsızlıkla F5'e basmanız durumunda proje ve sunucuyu tam olarak temizlediğinizden, yeniden oluşturduğunuzdan, yeniden konuşlandırdığınızdan ve yeniden başlattığınızdan emin olun. Hala boşuna kalırsanız, derleme sisteminin daha sonra bir ZIP aracıyla çıkarıp inceleyeceğiniz bir WAR dosyası oluşturmasına izin verin. .classDestek fasulye sınıfının derlenmiş dosyası, içindeki paket yapısında bulunmalıdır /WEB-INF/classes. Veya, bir JAR modülünün parçası olarak paketlendiğinde, derlenen .classdosyayı içeren JAR, içinde bulunmalıdır /WEB-INF/libve dolayısıyla örneğin EAR'lar /libveya başka bir yerde olmamalıdır .

Eclipse kullanıyorsanız, destekleyici fasulye sınıfının içinde olduğundan srcve öyle olmadığından WebContent emin olun ve Proje> Otomatik Olarak Oluştur'un etkinleştirildiğinden emin olun . Maven kullanıyorsanız, destek fasulye sınıf içinde olduğundan emin olmak src/main/javadolayısıyla ve değil de src/main/resourcesya src/main/webapp.

Web uygulamasını EJB + WAR (lar) ile bir EAR'nin parçası olarak paketliyorsanız, destekleyici fasulye sınıflarının WAR modülünde olduğundan ve dolayısıyla EAR modülünde veya EJB modülünde olmadığından emin olmanız gerekir. İşletme katmanı (EJB), web katmanı (WAR) ile ilgili herhangi bir yapı içermemelidir, böylece işletme katmanı birden çok farklı web katmanında (JSF, JAX-RS, JSP / Servlet, vb.) Yeniden kullanılabilir.


2. Ulaşılamayan Hedef, "varlık" null döndürdü

Bu , döndüğü gibi yuvalanmış özelliğe indirgenir . Bu genellikle yalnızca JSF'nin aşağıdaki gibi bir girdi bileşeni aracılığıyla değeri ayarlaması gerektiğinde ortaya çıkar , ancak gerçekte döndürülür .entity#{bean.entity.property}nullproperty#{bean.entity}null

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

CRUD listeleri ve / veya aynı görünümde diyaloglarla çalışmanız durumunda , model varlığını bir @PostConstruct, veya <f:viewAction>yöntemde veya belki bir add()eylem yönteminde önceden hazırladığınızdan emin olmanız gerekir .

@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();
    }

    // ...
}

Önemine gelince @PostConstruct; CDI gibi proxy'ler kullanan bir fasulye yönetimi çerçevesi kullanıyorsanız bunu normal bir kurucuda yapmak başarısız olur . Her zaman @PostConstruct, yönetilen bean örneği başlatmaya bağlanmak için kullanın (ve @PreDestroyyönetilen bean örneği yıkımına bağlanmak için kullanın). Ek olarak, bir yapıcıda henüz enjekte edilen bağımlılıklara erişiminiz olmazdı, ayrıca yapıcıda @Inject bean'e erişmeye çalışırken NullPointerException'a bakın .

Durumda entityIdyoluyla beslenir <f:viewParam>, kullanmak ihtiyacım olacağını <f:viewAction>yerine @PostConstruct. Ayrıca bkz. F: viewAction / preRenderView ve PostConstruct ne zaman kullanılır?

Ayrıca, nullmodeli yalnızca bir add()eylem yönteminde oluşturuyorsanız, geri göndermeler sırasında modeli koruduğunuzdan da emin olmanız gerekir . En kolayı fasulyeyi görüş alanına koymaktır. Ayrıca bkz . Doğru fasulye kapsamı nasıl seçilir?


3. Ulaşılamayan Hedef, 'null' null döndürdü

Bu aslında # 2 ile aynı nedene sahiptir, sadece (daha eski) EL uygulaması, istisna mesajında ​​görüntülenecek özellik adının korunmasında biraz hatalı ve sonuçta yanlış olarak 'boş' olarak ortaya çıkar. Bu, yalnızca bunun gibi iç içe geçmiş özellikler oldukça olduğunda hata ayıklamayı ve düzeltmeyi biraz daha zor hale getirir #{bean.entity.subentity.subsubentity.property}.

Çözüm hala aynı: söz konusu iç içe geçmiş varlığın nulltüm düzeylerde olmadığından emin olun .


4. Hedef Ulaşılamıyor, "0" null döndürdü

Bu aynı zamanda # 2 ile aynı nedene sahiptir, sadece kullanılan (daha eski) EL uygulaması, istisna mesajını formüle etmede hatalıdır. Eğer ayracı gösterim kullandığınızda bu İFŞA sadece []olduğu gibi EL #{bean.collection[index]}nereye #{bean.collection}kendisi boş olmayan, ancak belirtilen dizindeki öğe yok. Böyle bir mesaj daha sonra şu şekilde yorumlanmalıdır:

Ulaşılamayan Hedef, "koleksiyon [0]" null döndürdü

Çözüm ayrıca 2 numaralı ile aynıdır: koleksiyon öğesinin mevcut olduğundan emin olun.


5. Hedef Ulaşılamıyor, 'BracketSuffix' boş döndürdü

Bu aslında # 4 ile aynı nedene sahiptir, sadece (daha eski) EL uygulaması, istisna mesajında ​​görüntülenecek yineleme indeksini korumada biraz hatalı ve sonuçta yanlış bir şekilde gerçekten karakter olan 'BracketSuffix' olarak ortaya çıkar ]. Bu, yalnızca koleksiyonda birden çok öğe olduğunda hata ayıklamayı ve düzeltmeyi biraz daha zor hale getirir.


Diğer olası nedenler javax.el.PropertyNotFoundException:


3 numarayla karşılaşıyorum. #{bean.entity.property}Değeri çıktı olarak veriyor ama <p:selectBooleanCheckbox value="#{bean.entity.property}"/>başarısız oluyor. Benim booleanımın bir ayarlayıcısı var. Aynı birim üzerinde bir tamsayı özellik yapar bir giriş alanına kullanıldığında işi. Herhangi bir fikir?
Jasper de Vries

Kontrol etmeye değer başka bir şey de JSF ve CDI uygulamalarınızın bütünleştiğinden emin olmaktır ki benim sorunum buydu: stackoverflow.com/questions/44064995/…
Jerry B. no.1 stajyer

Göre:: Target Unreachable, identifier 'bean' resolved to nullÇoklu modül maven projelerinde (ejb, web, ear için modüller içeren) web modülünüzün ejb modülünüze bir bağımlılık ilan ettiğinden emin olun. Bu olmadan @ManagedBeanJSF2.0 kullanılarak çözülemez ve bunları içinde bildirmeniz gerekir faces-config.xml. Ejb'yi web modülüme dahil etmek için bir bağımlılık beyan etmediğimi fark ettim yaklaşık iki saat sürdü (kulağımda sadece ejb ve web vardı)
bish

1
@bish @ManagedBeanSınıflar gibi ön uç yapıları , ilk etapta hizmet katmanına (EJB projesi) ait değildir. Ayrıca bkz. Stackoverflow.com/questions/13011392/jsf-service-layer
BalusC

Bir fasulyenin serileştirilememesi de bu hataya neden olabilir mi (şüphelendiğim gibi stackoverflow.com/questions/47533584/… (ancak şu anda kendimi
deneyemiyorum

6

Hala takılıp kalanlar için ...

NetBeans 8.1 ve GlassFish 4.1'i CDI ile kullanırken, nedense bu sorunu uzak sunucuda değil, yalnızca yerel olarak yaşadım. Hile ne yaptı:

-> NetBeans tarafından sağlanan javaee-web-api 6.0 olan varsayılan pom sürümü yerine javaee-web-api 7.0'ı kullanarak:

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

-> bu javaee-web-api-7.0.jar dosyasını sunucuya kitaplık olarak yükleyin (alan1 klasöründeki lib klasörü) ve sunucuyu yeniden başlatın.


Bu, "Çalışma zamanı sınıf yolunuz temiz ve CDI API ile ilgili JAR'larda yineleme içermiyor" ile eşleşir. Başka bir deyişle, çalışma zamanı sınıf yolunuz bir şekilde yinelenen kitaplıklarla karışmıştı.
BalusC

Gerçekten, ve cevabınız odaklanmam gereken olası sorunu belirlememe yardımcı oldu ;-) Sadece burada özel çözümümün ayrıntılarını kanıtlayarak, birkaç kullanıcıya zaman kazandırabilir.
seinecle

1

Kendim çözdükten sonra bu hatayla ilgili bulgularımı paylaşmaya karar verdim.

Her şeyden önce, BalusC çözümleri ciddiye alınmalıdır, ancak daha sonra Netbeans'te özellikle Maven kullanarak bir Kurumsal Uygulama Projesi (EAR) oluştururken dikkat edilmesi gereken başka bir olası sorun vardır .

Netbeans, bir ana POM dosyası , bir EAR projesi , bir EJB projesi ve bir WAR projesi üretir . Projemdeki diğer her şey yolundaydı ve sorunun muhtemelen GlassFish 4.0'daki bir hata olduğunu varsayıyordum (bunu Netbeans'a kurmam ve takmam gerekiyordu) çünkü GlassFish 4.1'in, Netbeans 8.0'da gömülü GlassFish 4.1'i oluşturan bir Weld CDI hatası var. 2 yama dışında kullanılamaz.

Çözüm:

"Hedefe Ulaşılamıyor, tanımlayıcı" bean "null olarak çözüldü" hatasını çözmek için

I Ana POM projesine sağ tıklayın ve Özellikler'i seçin . Bir Proje Özellikleri İletişim Kutusu görünür, "Kaynaklar" ı tıklayın, " Kaynak / İkili Biçim " in 1.5 ve " Kodlama " nın Windows 1250 olarak ayarlandığını görünce şaşıracaksınız. " Kaynak / İkili Biçim " i 1.6 0r 1.7 olarak değiştirin. projenizin CDI uyumlu olmasını ve " Kodlama " UTF-8 .

Zaten uyumlu değillerse, diğer tüm alt projeler (EAR, EJB, WAR) için de aynısını yapın. Projenizi çalıştırın ve bu hatayı bir daha almayacaksınız.

Umarım bu, benzer bir hata yapan birisine yardımcı olur.


Cevabınızı genel olarak anlamakta güçlük çekiyorum (doğrudan ilgili olmayan bilgiler için) ve ayrıca kaynak / ikili format ve kodlamanın bu sayıda rol oynadığını düşünüyorum. Bunu değiştirmenin yalnızca sorunu çözen iyi / tam bir yeniden yapılandırmayı tetiklemediğinden emin misiniz?
Kukeltje

1

Çözümümü paylaşmaya karar verdim, çünkü burada verilen birçok cevap yardımcı olsa da, hala bu sorunu yaşadım. Benim durumumda, yeni projem için JSF 2.3, jdk10, jee8, cdi 2.0 kullanıyorum ve uygulamamı wildfly 12'de çalıştırdım, sunucuyu standalone.sh -Dee8.preview.mode = true parametresiyle başlatarak wildfly web sitesinde önerildiği gibi . Yaban sineği 13'ü indirdikten sonra "fasulye sıfıra çözüldü" ile ilgili sorun ortadan kalktı.


1

Bu hataya takıldım çünkü sınıfta @SpringBootApplicationdenetleyicinin paket adını belirtmeyi unuttum.

Temel paketi yapılandırmak yerine, Spring'in hangi bileşenleri taraması gerektiğini bu sefer daha spesifik hale getirmek istedim.

Şunun gibiydi:

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

Ancak doğru biçim şunlardan biridir:

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

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

Çözümümü paylaşmaya karar verdim çünkü doğru cevap çok kapsamlı olmasına rağmen bu (aptalca) hatayı kapsamıyor :)


0

Benim durumumda, @Named ("beanName") içinde bir yazım hatası yaptım, "beanName" olması gerekiyordu, ama örneğin "beanNam" yazdım.


0

Java konteyneri için wildfly 10 kullanıyorum. "Hedefe Ulaşılamıyor," varlık "null döndürdü" sorunu yaşadım. BalusC'nin önerileri için teşekkürler ama sorunum çözümlerin dışında açıklandı. Yanlışlıkla "import com.sun.istack.logging.Logger" kullanılarak; "import org.jboss.logging.Logger" yerine; CDI JSF EL uygulamasına neden oldu. Çözümü iyileştirmeye yardımcı olacağını umuyoruz.


0

Ben de aynı sorunu yaşadım. Çözüm çok daha basit çıktı. Bir datatable, yöntemi bir alıcı, yani getSomeMethod (), sadece someMethod () istemiyor gibi görünüyor. Datatable'daki durumumda findResults'u çağırıyordum. Destek fasulyemdeki yöntemi getFindResults () için değiştirdim ve işe yaradı.

Bir commandButton, onu daha kafa karıştırıcı hale getirmek için hizmet veren get olmadan bulmaya çalıştı.


0

# 2'ye gelince, benim durumumda değiştirdikten sonra sihirli bir şekilde canlandı

<body>

etiketle

<h:body>

Birkaç (daha basit, dürüst olmak gerekirse) JSF projesi yaptıktan sonra, şimdi onu kurarken farklı bir şey yaptığımı hatırlayamadım ve ilk kez bu tür bir hatayla karşılaştım. Çok basit bir giriş sayfası yapıyordum (kullanıcı adı, şifre, kullanıcı Bean ...) ve her zamanki gibi her şeyi ayarlıyordum. Gördüğüm tek fark, yukarıda bahsedilen etiketler. Belki birisi bunu yararlı bulur.


0

Benim durumumdaki sorun, parametre alan bir kurucu eklememdi, ancak bunun gibi Inject ek açıklamasına sahip boş bir kurucu değil.

@Inject public VisitorBean() {}

Herhangi bir kurucu olmadan test ettim ve bu da işe yarıyor gibi görünüyor.


0

1. konu için ( Hedefe Ulaşılamaz, tanımlayıcı 'bean' boş olarak çözüldü );

@BalusC ve diğer paylaşımcılara değerli cevapları kontrol ettim ama senaryomda bu sorunu aştım. Farklı isimde yeni bir xhtml oluşturduktan ve farklı isimde fasulye sınıfı oluşturduktan sonra kodları adım adım yeni fasulye sınıfına ve yeni xhtml dosyasına yazdım (kopyala-yapıştır değil).


0

AnnotationConfigWebApplicationContext bağlam parametresini web.xml dosyasından kaldırdığımda Bu çalışma

Aşağıda gösterildiği gibi param gibi bir parametreniz varsa, onu web.xml dosyasından kaldırmanız gerekir

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

bunun sorunu neden çözdüğünü detaylandırmak ister misiniz? Ya da neden olması sorunlara neden oluyor?
Kukeltje

-1

Eski stilde JSF ile çalışma Bean -config.xml dosyasında (WEB-INF klasöründe bulunur) yönetilen bean'ı tanımlamanız ve web.xml dosyasında şu şekilde bir referans yapmanız gerekir :

fasulye-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>

(Diğer kapsamları kullanmayı denedim ama ...)

web.xml

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

-2

Başka bir ipucu: JSF kullanıyordum ve mvn bağımlılıkları ekledim: com.sun.faces jsf-api 2.2.11

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

Ardından, Primefaces olarak değiştirmeye ve primefaces bağımlılığı eklemeye çalıştım:

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

Xhtml'mi h: yerine p: olarak değiştirdim, şablona xmlns: p = "http://primefaces.org/ui ekledim. Yalnızca JSF ile proyect sorunsuz çalışıyordu ve yönetilen beze ulaşıldı. Primefaces eklediğimde Ulaşılamayan nesneyi alıyordum (javax.el.propertynotfoundexception). Sorun, JSF'nin Primefaces'i değil ManagedBean'i oluşturması ve nesne için primefaces istemesiydi. Jsf-impl'yi .pom'umdan silmek zorunda kaldım, clean ve projeyi yükleyin. Bu noktadan sonra her şey yolunda gitti. Umarım yardımcı olur.


2
Sorunun nedeni hakkındaki varsayımınız mantıklı değil. PrimeFaces bir JSF uygulaması değildir. Bu, "Çalışma zamanı sınıf yolunuz temiz ve CDI API ile ilgili JAR'larda kopya içermiyor" gereksinimiyle eşleşiyor . Başka bir deyişle, çalışma zamanı sınıf yolunuz bir şekilde yinelenen kitaplıklarla karışıktı ve PrimeFaces onu sadece büyütüyordu, buna neden olmuyordu.
BalusC

-3

EL, $ {bean.propretyName} 'i açıklandığı gibi yorumlar - propertyName, alıcı / ayarlayıcı oluşturmanın açık veya örtük yöntemlerini kullandığınız varsayımına göre getPropertyName () olur

Adı açıkça bir işlev olarak tanımlayarak bu davranışı geçersiz kılabilirsiniz: $ {bean.methodName ()} Bu, değiştirmeden doğrudan Name () işlev yöntemini çağırır.

Erişimcilerinizin "get ..." olarak adlandırıldığı her zaman doğru değildir.


1
Bu doğru uygulama değildir ve bu, giriş bileşenlerinin arkasında doğru ayarlayıcıları çağırmayı imkansız kılar. Bu aynı zamanda söz konusu istisnanın nedeni olamaz. Bu, yalnızca söz konusu istisnanın, action="#{bean.property}"yerine gibi bir eylem yöntemi ifadesinde bir özelliğe başvuruda bulunmanıza neden olur action="#{bean.method}".
BalusC

Dikkat çekici bir şekilde, işlevsel programlama ile modern java dünyasında, bu "doğru uygulama" değişiyor. Dev.to/scottshipp/… ve referanslara bakın . Lombok'un get / set'in eklenmediği "akıcı" için bir ayarı olduğunu unutmayın. Şirketimizde mevcut uygulamaya farklı bir bakış açısına sahip görünen 1000 mühendis bulunmaktadır.
sdw

1
Bence siz ve 1000 mühendisiniz, özellikleri yöntemlerle karıştırıyorsunuz.
BalusC

Bu tasarım uygulaması, çok yüksek eşzamanlılığa sahip büyük ölçekli uygulamalarda yaygınlaşmaktadır. Eksik oyunuzun, geniş topluluğumuzun potansiyel bir hatayı bulmasına yardımcı olmak için cevabın değerinden ziyade, tasarım yönergelerinin tek bir bakış açısına dayanmasını öneriyorum.
sdw

1
Ha? Üzgünüm, neden bahsettiğin hakkında hiçbir fikrin olmadığı izlenimini görmezden gelemiyorum.
BalusC

-3

Benim durumumda "el-ri-1.0.jar" eksikti.


1
Normalde buna hiç ihtiyacınız yoktur, bu yüzden önemli olan başka bir şey vardır. Büyük olasılıkla kirli bir çalışma zamanı sınıf yolu. Uzun vadede durumu daha da kötüleştirmek yerine, sunucu tarafından zaten sağlanmış olması gereken kitaplıkları ekleyerek bunu düzeltmelisiniz.
BalusC
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.