Błąd przy tworzeniu Beana

0

Cześć,
dostaję taki błąd z nieznanych mi przyczyn.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'spittleController' defined in file [C:\Users\Bartek\IdeaProjects\demo5\out\artifacts\demo5\exploded\ROOT.war\WEB-INF\classes\pl\slovvik\controller\SpittleController.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type [pl.slovvik.repository.SpittleRepository] found for dependency [pl.slovvik.repository.SpittleRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [pl.slovvik.repository.SpittleRepository] found for dependency [pl.slovvik.repository.SpittleRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

Tymczasem wszystkie adnotacje i definicje są, moim zdaniem poprawne.

@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = Spittle.class)
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public InternalResourceViewResolver resolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}
@Controller
@RequestMapping("/spittles")
public class SpittleController {

    private SpittleRepository spittleRepository;

    @Autowired
    public SpittleController(SpittleRepository spittleRepository) {
        this.spittleRepository = spittleRepository;
    }

    @RequestMapping(method = RequestMethod.GET)
    public String spittles(Model model){
        model.addAttribute(spittleRepository.findSpittles(Long.MAX_VALUE, 20));
        return "spittles";
    }
}
public interface SpittleRepository {

    List<Spittle> findSpittles(long max, int count);
}

Dodatkowo test przechodzi pozytywnie.

    @Test
    public void shouldShowRecentSpittles() throws Exception{

        List<Spittle> expectedSpittles = createSpittleList(20);
        SpittleRepository mockRepository = mock(SpittleRepository.class);
        when(mockRepository.findSpittles(Long.MAX_VALUE,20)).thenReturn(expectedSpittles);

        SpittleController spittleController = new SpittleController(mockRepository);
        MockMvc mockMvc = standaloneSetup(spittleController).setSingleView(new InternalResourceView("/spittles.jsp")).build();
        mockMvc.perform(get("/spittles"))
                .andExpect(view().name("spittles"))
                .andExpect(model().attributeExists("spittleList"))
                .andExpect(model().attribute("spittleList", hasItems(expectedSpittles.toArray())));

    }
0

Masz jakąś implementację SpittleRepository? Test przechodzi bo ręcznie wstrzykujesz mock'a.

0

tak mam

public class Spittle {

    private final Long id;
    private final String message;
    private final Date time;
    private Double latitude;
    private Double longitude;

    public Spittle(String message, Date time) {
        this(null, message, time, null, null);
    }

    public Spittle(Long id, String message, Date time, Double latitude, Double longitude) {
        this.id = id;
        this.message = message;
        this.time = time;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public Long getId() {
        return id;
    }

    public String getMessage() {
        return message;
    }

    public Date getTime() {
        return time;
    }

    public Double getLatitude() {
        return latitude;
    }

    public Double getLongitude() {
        return longitude;
    }

    @Override
    public boolean equals(Object that){
        return EqualsBuilder.reflectionEquals(this, that, "id", "time");
    }

    @Override public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this, "id", "time");
    }


}
0

Ja ... co za człowiek
przepisujesz ze "Spring w akcji" bezmyslnie i w ogóle nie wiesz co czytasz
wiesz co to implementacja SplitterRepository?
To co podałeś to klasa modelu Splitta
ech..

0

Skąd miałem wiedzieć jak do tej pory nic o tym nie było napisane, a tak to zrozumiałem. W książce w tym momencie uruchamiają aplikację i rzekomo działa.

0

Działa bo nie będą podawać każdego kawałku kodu.
Zakładają że zrozumiałeś co dotychczas przeczytałeś

2

Bo przed rozpoczęciem nauki spring'a trzeba dobrze poznać Jave, w tej książce jest sporo pomijanych fragmentów bo są one nieistotne, albo było o nich mówione wcześniej. To nie jest tutorial krok po kroku jak zbudować aplikację w springu

1

W książce jest parę baboli, a autor książki zakłada, że wszystko jest jasne i oczywiste po jednym przeczytaniu ;)

Nie mniej, masz interfejs:

public interface SpittleRepository {
 
    List<Spittle> findSpittles(long max, int count);
}

Teraz ten interfejs trzeba zapodać do klasy coś w ten deseń:

@Repository
public class SpittleDAO implements SpittleRepository {

public List<Spittle> findSpittles(long max, int count) {

//tutaj kod metody, w zależności od tego z jakiej technologii korzystasz

}
}

Ja bym zmienił nazwę interfejsu na ISpittleRepository, tak żeby klasę nazwać SpittleRepository. W książce podane jest ogólne @Component i autor książki zaleca używanie tej adnotacji w każdym komponencie naszej aplikacji. Natomiast w sieci jest mnóstwo materiałów, które nie korzystają tej adnotacji. Bo istnieją różne w zależności od zastosowania. Jest @Repository do warstwy DAO, @Service do serwisów, @Controller do kontrolerów. I tak w jednym miejscu pisze o @Component a w innych olewa to i używa adnotacji zgodnie z przeznaczeniem.

0

Ok mój błąd nie doczytałem, że implementacja będzie w rozdziale 10, ale uważam że jest to bez sensu pokazywać działający fragment programu w rozdziale 5.

1 użytkowników online, w tym zalogowanych: 0, gości: 1