• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Parameter 0 of constructor in Service required a bean of type Repository that could not be found

Object Storage Arubacloud
0 głosów
1,144 wizyt
pytanie zadane 31 sierpnia 2022 w Java przez Lulex Użytkownik (820 p.)

Cześć,

próbuję dodać do mojego rest api dynamiczne wyszukiwanie po request paramterach. Udało się znaleźć fajne rozwiązanie jednak oczywiście coś nie działa :) .... Chciałem dodać  specification-arg-resolver 

Dodałem dependency:

<dependency>
     <groupId>net.kaczmarzyk</groupId>
     <artifactId>specification-arg-resolver</artifactId>
</dependency>

i postępowałem zgodnie z tutorialem .

W Controllerze mam zrobione chyba wszystko poprawnie:

@RestController
@RequestMapping("/drivers")
@RequiredArgsConstructor
public class DriverController {
    private final DriverService driverService;

    @GetMapping("/test2")
    public Set<DriverDto> test2(
            @And({
                    @Spec(path = "name", spec = Equal.class),
                    @Spec(path = "surname", spec = Equal.class)
            }) Specification<DriverEntity> customerSpec,
            Pageable pageable) {
        Set<DriverEntity> driverEntities = driverService.getAllWithSpec(customerSpec, pageable);
        return modelMapperService.mapSetToSetOfEnteredClass(driverEntities, DriverDto.class);
    }
}

metoda getAllWithSpec() w serwisie wygląda następująco:

@Service
@RequiredArgsConstructor
public class DriverService {
    private final DriverEntityRepository driverEntityRepository;

    public Set<DriverEntity> getAllWithSpec(Specification<DriverEntity> customerSpec, Pageable pageable) {
        return driverEntityRepository.findAll(customerSpec, pageable);
    }
}

Tak jak w specyfikacji dodałem również:

@Configuration
@EnableJpaRepositories
public class MyConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new SpecificationArgumentResolver());
    }
}

No i teraz zaczynają się schody... Przy próbie odpalenia apki pojawia się:

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

Description:

Parameter 0 of constructor in com.exampleservice.DriverService required a bean of type 'com.example.repository.DriverEntityRepository' that could not be found.


Action:

Consider defining a bean of type 'com.example.repository.DriverEntityRepository' in your configuration.


Process finished with exit code 1

 

I nie do końca rozumiem czemu się tak dzieje... 

Gdy zakomentuję ten MyConfig to aplikacja startuje, ale przy próbie wysłania requesta np 

http://localhost:8081/drivers/test2?name=Tom&surname=Smith

pojawia się błąd:

java.lang.IllegalStateException: No primary or single unique constructor found for interface org.springframework.data.jpa.domain.Specification

i z tego co mi się udało znaleźć jest on spowodowany brakiem właśnie MyConfig. Będę wdzięczny za wszystkie pomysły :)

2 odpowiedzi

0 głosów
odpowiedź 31 sierpnia 2022 przez Lulex Użytkownik (820 p.)

Dobra, nie było tematu.

Usunąłem 

@EnableJpaRepositories

z MyConfig i poszło. Wyszukiwanie działa poprawnie.

komentarz 1 września 2022 przez Wiciorny Ekspert (269,710 p.)
teraz tylko zastanów się dlaczego z ową adnotacją którą użyłeś, nie działał program poprawnie.
W ten sposób nauczysz się chociaż, co dana adnotacja wnosi lub nie, a nie będziesz używał czegoś bez ówczesnego sprawdzenia np. dokumentacji.

To cenna uwaga na przyszłość, bo potem, ktoś Cię zapyta: co robi i jak działa @Service vs @Repository, albo @RestController vs @Controller
0 głosów
odpowiedź 1 września 2022 przez Wiciorny Ekspert (269,710 p.)

Problemem jest jeden fakt, że oczekujesz konstruktora z argumentami dla  jednego ze składowych
 

@Service
@RequiredArgsConstructor
public class DriverService {
    private final DriverEntityRepository driverEntityRepository;
 
    public Set<DriverEntity> getAllWithSpec(Specification<DriverEntity> customerSpec, Pageable pageable) {
        return driverEntityRepository.findAll(customerSpec, pageable);
    }
}

Dokładnie to   DriverEntityRepository driverEntityRepository; 
Jako obiekt zależny, nie posiada żadnej informacji jak ma być wstrzyknięty poprzez zależność, natomiast korzystasz z adnotacji.
 

@RequiredArgsConstructorgeneruje konstruktor z 1 parametrem dla każdego pola, które wymaga specjalnej obsługi. Wszystkie niezainicjowane finalpola otrzymują parametr, a także wszystkie pola oznaczone jako @NonNullniezainicjowane w miejscu, w którym są zadeklarowane. W przypadku pól oznaczonych @NonNull, generowane jest również jawne sprawdzenie wartości null. Konstruktor wyrzuci NullPointerExceptionif którykolwiek z parametrów przeznaczonych dla pól oznaczonych @NonNullinclude null. Kolejność parametrów odpowiada kolejności, w jakiej pola pojawiają się w Twojej klasie.

Dlaczego w takim razie nie odnajduje BEANA? Dlatego, że 
 

 @EnableJpaRepositories, służy do skanowania pakietów pod kątem konfiguracji i klasy repozytorium dla Spring Data JPA.

skanowanie musi zostać określone przez Ciebie w jakim pakiecie są klasy, więc aktualnie- masz to źle skonfigurowane i skanowanie nie widzi klasy  DriverEntityRepository , więc jednocześnie dla niego taki BEAN nie istnieje.
Usunięcie rozwiązuje problem, bo wtedy korzystasz z domyślnego skanowania repozytorium, wtedy widocznosc pakietu z tym beanem jest uwzględniona i bean może zostać poprawnie załadowany. 

Podobne pytania

0 głosów
1 odpowiedź 336 wizyt
pytanie zadane 31 lipca 2019 w PHP przez r.mar Początkujący (470 p.)
0 głosów
1 odpowiedź 995 wizyt
pytanie zadane 16 października 2020 w Java przez Stararara Początkujący (300 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...