Yapılandırmanızda [Spring-Boot] 'paket' türünde bir fasulye tanımlamayı düşünün


110

Aşağıdaki hatayı alıyorum:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.


Action:

Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.

Bu hatayı daha önce hiç görmedim ama @Autowire'ın çalışmaması garip. İşte proje yapısı:

Başvuru Arayüzü

public interface Applicant {

    TApplicant findBySSN(String ssn) throws ServletException;

    void deleteByssn(String ssn) throws ServletException;

    void createApplicant(TApplicant tApplicant) throws ServletException;

    void updateApplicant(TApplicant tApplicant) throws ServletException;

    List<TApplicant> getAllApplicants() throws ServletException;
}

Başvuru Sahibi

@Service
@Transactional
public class ApplicantImpl implements Applicant {

private static Log log = LogFactory.getLog(ApplicantImpl.class);

    private TApplicantRepository applicantRepo;

@Override
    public List<TApplicant> getAllApplicants() throws ServletException {

        List<TApplicant> applicantList = applicantRepo.findAll();

        return applicantList;
    }
}

Şimdi sadece Autowire Başvuru Sahibine erişebilmeli ve erişebilmeliyim, ancak bu durumda onu aradığımda çalışmıyor @RestController:

@RestController
public class RequestController extends LoggingAware {

    private Applicant applicant;

    @Autowired
    public void setApplicant(Applicant applicant){
        this.applicant = applicant;
    }

    @RequestMapping(value="/", method = RequestMethod.GET)
    public String helloWorld() {

        try {
            List<TApplicant> applicantList = applicant.getAllApplicants();

            for (TApplicant tApplicant : applicantList){
                System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
            }

            return "home";
        }
        catch (ServletException e) {
            e.printStackTrace();
        }

        return "error";
    }

}

------------------------ GÜNCELLEME 1 -----------------------

ekledim

@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(WebServiceApplication.class, args);
    }

}

ve hata gitti ama hiçbir şey olmadı. Birlikte her şey konu işlemi dışarı yorumladı Ancak Applicantiçinde RestControllereklemeden önce @ComponentScan()ben bir dize dönebildi UIbenim anlam dolayısıyla RestController, çalışıyordu şimdi atlanır ediliyor. Whitelabel Error PageŞimdi çirkinim .

--------------------- GÜNCELLEME 2 --------------------------- ---

Şikayet ettiği fasulyenin temel paketini ekledim. Hata okur:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.


Action:

Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.

ekledim @ComponentScan

@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(WebServiceApplication.class, args);
    }

}

---------------------------- Güncelleme 3 -------------------- -

ekleme:

@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {

hala depomun içine ApplicantImplaldığı sınıfımdan şikayet ediyor.@AutowiresTApplicantRepository


Başvuru bağlam dosyanız nerede? Eğer birini yoksa, Vermek düşünmelisiniz Bahar gibi ek açıklamalarla bazı ipucu @ComponentScan bütün fasulye kullanılabilir hale getirmek için.
Mario Santini

@MarioSantini lütfen güncelleme 1'e bakın
Mike3355

Her güncellemeden sonra hatalarda değişiklik olduğunu varsayıyorum. Mümkünse, proje yapınızı ve her durumda hata günlüklerini / yığın takibini gönderin .. Hatayı bir "bir şey" den ziyade "Neden" oluştuğunu bilmek daha iyidir. Benzer bir sorunla karşılaşan diğer kişiler için de faydalı olacaktır.
Ameen.M

Yanıtlar:


202

Bunun nedeni, projenin farklı modüllere ayrılmış olması olabilir.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {

5
Güzel. Projem birkaç modüle bölünmüş durumda. ComponentScan sorunumu çözdü!
kholofelo Maloma

ComponentScan ek açıklaması sorunumu çözüyor ancak @EnableAutoConfiguration çözmüyor
jpl

Aslında, EnableAutoConfiguration, belirli öğeler için bir temel "arama paketi" ni örtük olarak tanımlar ve bir kök paketi kullanmak, ComponentScan ek açıklamasının bir basePackage niteliği belirtmeye gerek kalmadan kullanılmasına da izin verir. Ana sınıfınız kök paketindeyse @SpringBootApplication ek açıklaması kullanılabilir
jpl

1
Bu çözüm, 2.0.4 sürümündeki bu hatayla bana yardımcı oldu
manu muraleedharan

2
Evet, projenin farklı modüllere bölünmüş olmasından kaynaklanıyor. @EntityScanve @EnableJpaRepositoriesdoğru paket isimleriyle benim için çalıştı.
Adi Sivasankaran

52

Bir ... şans var
Sen eksik olabilir @Service, @Repositorylütfen ilgili uygulama sınıfları ile ilgili ek açıklama.


2
Bu kabul edilen cevap, basit ve isabetli çözüm olmalıdır. Teşekkür ederim.
nightfury

1
Benim için çalıştı. Teşekkürler.
Okafor T Kosiso

1
Teşekkür ederim, @Repository notunu kaçırdım
sergodeeva

1
Evet, cevap bu olmalı. Yukarıdaki cevaplar, taramanın başarısız olduğunu varsaymaktır, bu da yanlıştır.
Sumit Badsara

48

Başvuran sınıfınız taranmamış gibi görünüyor. Varsayılan olarak, yerleştirdiğiniz sınıf olarak kök ile başlayan tüm paketler @SpringBootApplicationtaranacaktır.

main"WebServiceApplication" sınıfınızın "" içinde olduğunu varsayın com.service.something, ardından " com.service.something" altındaki tüm bileşenler taranır ve " com.service.applicant" taranmaz.

Paketlerinizi, "WebServiceApplication" bir kök paketin altına düşecek ve diğer tüm bileşenler bu kök paketin parçası olacak şekilde yeniden yapılandırabilirsiniz. Veya @SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})"TÜM" bileşenlerin taranacağı ve yaylı kapta başlatılacağı şekilde vb.

Yoruma göre güncelleme

Maven / gradle tarafından yönetilen birden fazla modülünüz varsa, tüm yay ihtiyaçları, taranacak pakettir. Spring'e "com.module1" i taramasını söylüyorsunuz ve kök paket adı "com.module2" olan başka bir modülünüz var, bu bileşenler taranmayacak. Spring'e "com" u taramasını bile söyleyebilirsiniz, bu daha sonra " com.module1." ve " com.module2."


Benim projem yapı farklı modüllerdir. Örneğin hizmetlerin kendi modülü olacak ve build.gradle. Bu build.gradlemodül isimleri dependenciesana yöntemle modülün içine eklenir . Bu nedenle, gördüğün zaman @ComponentScan("module-service")işe yarayacağını düşündüm. Ancak içinde module-servicebir paket var. Öyleyse sorum neye benzeyecek? Sadece paket adını mı, modül adını mı yoksa her ikisini birden mi adlandırmalıyım?
Mike3355

Paketlerin farklı modüllere düşmesi önemli değildir. Bileşenlerin taranacağı ambalajlar yaya göre belirtilmelidir. Tüm modüllerinizin tüm "kök" paket adlarını "scanBasePackages" özniteliğinde verebilirsiniz .. Ve tüm "paketleri", modüller değil, belirtilmesi gerekir.
Ameen.M

Söylediklerini yaptın ve hata gitti ama sadece başka bir paket hakkında şikayet ettim. Doğal olarak listeye ekledim ama kaybolmayacak. Bunu şu şekilde uyguladım:@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
Mike3355

Az önce yaptım @SpringBootApplication(scanBasePackages= "com")ve JPA deposu hakkında şikayet ediyor. Çok teşekkür ederim. Yukarıdakileri yaparsanız Spring'in "com" ile başlayan tüm paketleri tarayacağını bilmiyordum.
Mike3355

23

Temelde bu, Sınıf Uygulamanızı "başka bir pakette" bulundurduğunuzda gerçekleşir. Örneğin:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

Problemi Application.class içerisinde çözüyorum.

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

Daha az zarif olan başka bir yol ise: tüm konfigürasyon sınıflarını aynı pakete koymak.


2
Aslında, @ComponentScanyukarıdaki senaryoda belirtmenize gerek yoktur . Senin Çünkü Application.class(olan @SpringBootApplicationek açıklama) yerleştirilir com.serverhangi yine her ikisi için köküdür com.server.configyanı sıra com.server.repository.
Ameen.M

@ Ameen.MTam sorum şu, neden hala çözülemiyor ve neden mongo repoları için açıkça tarama gerektiriyor @EnableMongoRepositories?
Karthikeyan

10

Benim durumumda çok büyük bir hata yaptım. @ServiceServis arayüzünü kurdum .

Düzeltmek için @Serviceservis dosyasının uygulamasını koydum ve benim için çalıştı.


Benim için aynı. Teşekkürler
Manta

7

Bir fasulye, @Autowired olduğu aynı paketteyse, asla böyle bir soruna neden olmaz. Ancak, fasulyelere varsayılan olarak farklı paketlerden erişilemez. İçin bu sorunu gidermek için şu adımları izleyin:

  1. Ana sınıfınızda aşağıdakileri
    içe aktarın : import org.springframework.context.annotation.ComponentScan;
  2. ana sınıfınızın üzerine açıklama ekleyin:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringExampleApplication.class, args);
    }
}

5

Deponuza @Repository ile açıklama ekleyerek basitleştirebileceğinizi düşünüyorum, daha sonra Spring Framework tarafından otomatik olarak etkinleştirilecektir.


4

Benim durumumda bu iki seçenek işe yaradı.

  1. olarak //@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) dahil da tutan bir paket Application.classlistesinde veya

  2. Basitçe ekleyin @EnableAutoConfiguration; tüm bahar fasulyelerini otomatik olarak tanır.


3

Bu, Lombok kullanıyorsanız ve @RequiredArgsConstructorve @NonNullfor alanlarını eklerseniz, ancak bazı alanlarınızın kurucuya enjekte edilmemesi durumunda da olabilir. Bu, aynı hatayı alma olasılıklarından yalnızca biridir.

0 parametresi, bulunamayan MissingBeanName türünde bir bean gerektirdi

Benim durumumda hata @NonNull, uygulamanın kaldırılmasından sonra sorunun hangi Denetleyicide olduğunu söyledi.


3

Spring Boot 2 ile Maven çoklu modül projemde tanıdık bir problemle karşılaştım. Sorun, alt Maven modüllerindeki paketlerimin isimlendirilmesiyle ilgiliydi.

@SpringBootApplication, @ComponentScan, @EnableAutoConfiguration, jpa-repositories, json-serialization gibi birçok bileşeni kapsamaktadır. Ve @ComponentScan'i com. *******. Uzay paketine yerleştirir. Paket com. *******. Alanının bu bölümü tüm modüller için ortak olmalıdır.

Düzeltmek için:

  1. Tüm modül paketlerini yeniden adlandırmalısınız. Tüm Maven modüllerindeki tüm paketlerde sahip olmanız gereken diğer kelimeler - aynı üst kısım. Örneğin - com. *******. Boşluk
  2. Ayrıca giriş noktanızı bu pakete taşımalısınız - com. *******. Boşluk

2

İnternette bir cevap aradım ama görünüşe göre benim durumum için tek bir uygun çözüm yok: Başlangıçta her şey şu şekilde çalışıyor:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

Sonra bir şeyi önbelleğe almak için bir harita eklemeye çalışıyorum ve şu oluyor:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

Boom!

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

Kaldırdım @AllArgsConstructor(onConstructor = @__(@Autowired))ve @Autowiredher biri için ekledim repositoryve servicehariç Map<String, String>. Sadece eskisi gibi çalışıyor.

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

Umarım bu yardımcı olur.


2

Uygulamaya aşağıdaki ek açıklamayı ekledikten sonra benim için çalıştı:

@ComponentScan({"com.seic.deliveryautomation.mapper"})

Aşağıdaki hatayı alıyordum:

"yapıcının 1. parametresi, bulunamayan bir tür eşleyici çekirdeği gerektirdi:



2

Aynı fasulyeyi yanlışlıkla iki farklı sınıfta tanımlarsanız da bu hatayı alırsınız. Bu bana oldu. Hata mesajı yanıltıcıydı. Fazladan fasulyeyi çıkardığımda sorun çözüldü.


1
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

1

@Service sınıfı soyut olarak işaretlenmişse bu gerçekleşebilir.


1

Sınıf bağımlılığınız Spring tarafından yönetiliyorsa, POJO sınıfımıza varsayılan / boş arg yapıcı eklemeyi unutursak bu sorun oluşabilir.


1

Birine yardımcı olabilir. Aynı sorunu yaşadım, aynı hata mesajı, her şey aynı. Diğer yanıtlardan çözümler denedim, kullandığım fasulyenin aslında otomatik kablolanmış olanla aynı ada sahip olduğunu fark edene kadar yardımcı olmadım. Refactor'ın ortasında oldu, bu yüzden sınıfı yeniden adlandırmak zorunda kaldım, bu da olumlu sonuçlandı. Şerefe


1

Ben de aynı sorunla karşılaştım. Mongo DB deposu Spring boot tarafından tanımlandı, ancak mongo havuzunu genişleten bir depo arayüzü için Bean yaratmıyordu.

Benim durumumdaki sorun, "spring + mango" için maven pom'daki yanlış sürüm belirtimiydi. Eserin grup kimliğini değiştirdim ve hepsi sihir gibi çalıştı. Yaylı bot her şeyi hallettiği için ek açıklamalara gerek yok.

Sorun çözme sürecim sırasında, tüm web'de çözümler arıyordum ve bu sorunun aslında proje yapılandırmasıyla ilgili olduğunu fark ettim, bu sorunla karşılaşan herkes önce proje kurulumunu kontrol etmeli ve hata hakkında daha fazla ayrıntı almak için ilkbahardan hata ayıklamayı etkinleştirmeli ve tam olarak bu süreçte yaratma başarısız oldu.


0

Benim durumumda bu hata, içe aktarımın yanlış olması nedeniyle ortaya çıkıyor, örneğin, yay kullanıldığında, içe aktarma otomatik olarak beliriyor:

import org.jvnet.hk2.annotations.Service;

ama ihtiyacım vardı:

import org.springframework.stereotype.Service;

0

RestTemplate'i bir servis sınıfına enjekte etmem gereken bir durum vardı. Ancak, RestTemplate hizmet sınıfı tarafından alınamaz. Yaptığım şey, ana uygulamayla aynı paket altında bir sarmalayıcı sınıfı oluşturmak ve sarmalayıcıyı Bileşen olarak işaretlemek ve bu bileşeni hizmet sınıfında otomatik olarak bağlamaktı. Sorun çözüldü. umarım senin için de çalışır


0

Benim hatam şuydu:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

onun yerine:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

0

Sanırım, RequestController'ınızda @Bean ek açıklamasını kaçırıyorsunuz

Bean'i dosyanıza ekleyin, bu sorunumu çözdü
öğretici noktadan Spring Boot'u öğrenirken bu çözümü aldım

private Applicant applicant;

@Bean 
public Applicant applicant() { 
    return new Applicant(); 
}

0

Spring Boot Data JPA Starter bağımlılığının eklenmesi sorunu benim için çözdü.

Uzman

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

Gradle

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.6.RELEASE'

Ya da doğrudan buraya gidebilirsin


Bu aslında bu durumda geçerli değil. Veritabanına bağlantı ayrıntılarını sorar (Bir Veri Kaynağı yapılandırılamadı: 'url' özniteliği belirtilmedi ve katıştırılmış veri kaynağı yapılandırılamadı.). Veritabanıyla etkileşime girmeden manuel olarak test etmek istediğim bir durumda bu işe yaramayacak.
Thomas Okonkwo

0

Eğer kullanırsanız , açıklama ile interfacegenişletebilirsiniz .CrudRepository<Applicant,Long>@Repository


0

Sorun, örneğin başına kullandığınızda @EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)ve daha sonra paket adını yeniden adlandırdığınızda veya başka bir yere taşıdığınızda da ortaya çıkabilir .

Çok modüllü bir maven projesi ve yaylı önyükleme ile çok sık karşılaşıldı


0

Bir arayüzde @autowired yapmaya çalışıyor olma ihtimaliniz var uygulamadan önce .

örnek çözüm:

    **HomeController.java**
    class HomeController{

      @Autowired
      UserService userService;
    .....
    }
----------------------------------------------------------------------
    **UserService.java** 
    public interface UserService {
        User findByUsername(String username);
    .....
    }
-----------------------------------------------------------------------
     **UserServiceImpl.java**
     @Service
     public class UserServiceImpl implements UserService{

         public User findByUsername(String username) {
           return userDao.findByUsername(username);
         }
        ....
      }

<i>This is not italic</i>, and [this is not a link](https://example.com)

0

@Service gibi açıklama türü yapılandırmasını iş parçacığı çalıştırma yönteminden kaldırın.

@Service, @Component

0

Proje yapısını aşağıda verildiği gibi yapılandırmayı deneyin:

Tüm repo, servis, paketleri ana paketin alt paketine koyun:

package com.leisure.moviemax;  //Parent package
        
@SpringBootApplication
@PropertySource(value={"classpath:conf.properties"})
    
public class MoviemaxApplication implements CommandLineRunner {
        
package com.leisure.moviemax.repo; //child package

@Repository
public interface UsrRepository extends JpaRepository<UserEntity,String> {

0

Baharın dünyayı taramadığını hatırlatarak, springboot uygulamasının depolandığı paketin altındaki her şey anlamına gelen hedeflenmiş taramayı kullanır. bu nedenle bu hata "[Spring-Boot] yapılandırmanızda 'paket' türünde bir fasulye tanımlamayı düşünün" hatası görünebilir çünkü farklı bir springboot uygulama paketinde hizmet arabirimleriniz vardır.

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.