Tomcat nie znajduje JdbcTemplate, RowMapper mimo wpisu w pom.xml

0

Hej!

Tworzę projekt w Springu 4 MVC z użyciem Spring-JDBC i wpadłem na problem, którego nie jestem w stanie rozwiązać samodzielnie.
Chciałem robić w Springu 5, ale dokumentacja nie za bardzo pomaga (zwłaszcza kiedy chodziło o pozbycie się xmla z projektu). Wypożyczyłem dzisiaj Spring MVC Przewodnik dla początkujących (jeden chyba z 5 dostępnych egzemplarzy na uczelni xd), wygląda ciekawie, ale jest dużo xmla, więc mam mieszane uczucia.

Mam podstawową wiedzę o DI i MVC w wersji Xmlowej, więc projekt jest stworzony przy pomocy znalezionych tutoriali w necie. Jakby ktoś miał rzetelne i czytelne źródło nauki (płatne też) to wrzućcie w komentarzu, bo im dłużej szukam tym mniej sensownego contentu znajduję.

Do rzeczy:
Próbuję korzystać z bazy danych najprostszym możliwym sposobem, czyli JDBC (bo nie znam JPA, a nie ukrywam, że zależy mi na prędkości stworzenia projektu - do wtorku).

Link do repo

Pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.4.RELEASE</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.31</version>
        </dependency>
    </dependencies>

Oto jak konfiguruję JdbcTemplate:

@Configuration
@EnableWebMvc
@ComponentScan("com.burdzi0.webstore")
@PropertySource(value = { "classpath:application.properties" })
public class MvcConfig implements WebMvcConfigurer {

    @Autowired
    private Environment env;

    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resource/**")
                .addResourceLocations("/resources/");
    }

    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    public InternalResourceViewResolver getJspViewResolver(){
        String prefix = "/WEB-INF/jsp/";
        String suffix = ".jsp";
        return new InternalResourceViewResolver(prefix, suffix);
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getRequiredProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getRequiredProperty("jdbc.url"));
        dataSource.setUsername(env.getRequiredProperty("jdbc.username"));
        dataSource.setPassword(env.getRequiredProperty("jdbc.password"));
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.setResultsMapCaseInsensitive(true);
        return jdbcTemplate;
    }
}

I DAO:

@Repository("userDAO")
public class UserDAOImpl implements UserDAO{

    private JdbcTemplate jdbcTemplate;

    @Autowired
    public UserDAOImpl(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public User findByName(String name) {
        return jdbcTemplate.queryForObject("select * from users where name=?" ,
                new BeanPropertyRowMapper<User>(User.class), name);
    }

    public List<User> findAll() {
        return jdbcTemplate.query("SELECT * FROM users",
                new BeanPropertyRowMapper<User>(User.class));
    }

    public int addUser(User user) {
        return jdbcTemplate.update(
                "insert into users (name, password, admin) values (?, ?, ?);",
                user.getName(),
                user.getPassword(),
                user.isAdmin());
}

Pełny stack trace w linku, najważniejsze poniżej

Exception

javax.servlet.ServletException: Servlet.init() for servlet [dispatcher] threw exception
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Thread.java:748)

I ostatnia część

java.lang.ClassNotFoundException: org.springframework.jdbc.core.JdbcTemplate
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1275)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1104)
java.lang.Class.getDeclaredMethods0(Native Method)
java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
java.lang.Class.getDeclaredMethods(Class.java:1975)
org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:158)
org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:386)
org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:311)
org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:241)
org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198)
org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:166)
org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:316)
org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:233)
org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273)
org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93)
org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:693)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:676)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:545)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:499)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:172)
javax.servlet.GenericServlet.init(GenericServlet.java:158)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)

[EDIT] Musiałem tak wrzucić bo coś markdown nie śmiga, sprawdziłem na https://stackedit.io/editor i tam się elegancko wyświetla.

0
<dependency> <groupid>org.springframework</groupid> <artifactid>spring-jdbc</artifactid> <version>wersja_springa</version> </dependency>
0

Zrobiłem update posta, wszystko w pomie jak należy (chyba).

0

Bump

0

Niekonsekwentnie w tym pomie. Część jako compile, część bez określenia. Nie wiem, czy to ma znaczenie.

Powiedz, jak masz zapakowany ten serwlet i gdzie masz tę klasę (plik class), której tomcat nie znajduje. Wrzucałeś jakieś biblioteki wprost do tomcata? A może to nie Tomcat.

0

screenshot-20180311215811.png
Taka konfiguracja. Klasa znajduje się w bibliotece, wykorzystywana jest tak:

@Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getRequiredProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getRequiredProperty("jdbc.url"));
        dataSource.setUsername(env.getRequiredProperty("jdbc.username"));
        dataSource.setPassword(env.getRequiredProperty("jdbc.password"));
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.setResultsMapCaseInsensitive(true);
        return jdbcTemplate;
    }

Zarządzanie elementami frameworka zostawiam Mavenowi, sam nic nie kombinowałem. Wygląda jakby jej nie było nigdzie, ale dlaczego w takim razie IntelliJ indeksuje ją poprawnie?:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

Nie wiem gdzie szukać błędu

0

Dodaj tam jakiś maven-war-plugin bo teraz budujesz tzw "thin jar" który nie zawiera w sobie zależności. a jak chcesz odpalić samego wara to musisz zrobić "fat".

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