Spring JDBC 404在null get

时间:2018-03-30 16:16:59

标签: java spring spring-jdbc

我试图学习如何使用Spring JDBC连接数据库。现在,我只想尝试一个简单的get请求来检索H2中表的内容。但是,每次运行测试时,都会出现404错误:

12:05:41.237 [main] DEBUG org.springframework.web.client.RestTemplate - Created GET request for "http://localhost:8080/rides"
12:05:41.339 [main] DEBUG org.springframework.web.client.RestTemplate - GET request for "http://localhost:8080/rides" resulted in 404 (null); invoking error handler

org.springframework.web.client.HttpClientErrorException: 404 null

    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:777)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:730)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:686)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:631)
    at com.example.RideResourcesTest.testGetRides(RideResourcesTest.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)


Process finished with exit code -1

我的测试代码是: 公共类RideResourcesTest {

@Test
public void testGetRides() {
    RestTemplate restTemplate = new RestTemplate();

    ResponseEntity<List<Ride>> rideResponse = restTemplate.exchange(
            "http://localhost:8080/rides", HttpMethod.GET,
            null, new ParameterizedTypeReference<List<Ride>>() {
            }
    );
    List<Ride> rides = rideResponse.getBody();

    for (Ride ride : rides) {
        System.out.println("Ride Name: " + ride.getName());
    }
}

我的存储库实现是:

@Repository("rideDAO")
public class RideDAOImpl implements RideDAO {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public List<Ride> getRides() {
        List<Ride> rides = jdbcTemplate.query("select * from ride;", new RideRowMapper());
        return rides;
    }
}

我的服务实施:

@Service("rideManager")
public class RideManagerImpl implements RideManager {

    @Autowired
    private RideDAO dao;

    @Override
    public List<Ride> getRides() {
        return dao.getRides();
    }
}

最后,我的控制器如下:

@Controller
public class RideResource {

    @Autowired
    private RideManager manager;

    @RequestMapping(value = "/rides", method = RequestMethod.GET)
    public @ResponseBody List<Ride> getRides() {
        return manager.getRides();
    }
}

我的代码中没有看到任何不合适的地方,所以我想知道还有什么可能导致这种情况发生。部分我怀疑我可能在Tomcat设置上做错了什么,但这对我没有任何意义;如果是这种情况,它可能无法启动,而且每次使用它时似乎都能正确部署战争。

编辑:这是我的Spring配置文件,用于注册我的应用程序的组件,以及连接到数据库:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tool"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-4.3.xsd">

    <context:annotation-config/>
    <context:component-scan base-package="com.example"/>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver"/>
        <property name="url" value="jdbc:h2:tcp://localhost/~/test"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

Web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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-app_2_5.xsd">

    <display-name>jdbcSpring</display-name>

    <servlet>
        <servlet-name>jdbcSpringServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                src/main/webapp/WEB-INF/config/servlet-config.xml
                classpath:jdbc-config.xml
            </param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>jdbcSpringServlet</servlet-name>
        <url-pattern>/</url-pattern>

    </servlet-mapping>

</web-app>

编辑:此外,此代码是教程的一部分,用于演示如何使用Spring JDBC。我试图让代码在我自己的Intellij实例上运行。该课程的制作者在GitHub上发布了他的代码,here

1 个答案:

答案 0 :(得分:0)

我在错误中看到的是,

org.springframework.web.client.HttpClientErrorException: 404 null

您正试图在代码中连接到您的客户端而客户端未启动。

如果您通过其他模板查询网址,该客户端应首先显示。