【问题标题】:RESTful web-service not found when I deploy app in eclipse当我在 Eclipse 中部署应用程序时找不到 RESTful Web 服务
【发布时间】:2015-05-08 13:36:54
【问题描述】:

所以,我有一个带有少量 RESTful 网络服务的 Spring Maven 网络应用程序。为了测试,这个项目在 Spring (4.1.4.RELEASE) 中。我正在使用最新的 STS (Spring-Eclipse) 工具,并且我正在使用 Tomcat 8 作为服务器。

我的 UserController 设计如下:

@Controller
@RequestMapping("/users")
public class UserController {
    private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    @Autowired
    private IUserService service;

    @RequestMapping(value = "", method = RequestMethod.GET, headers = "Accept=application/json")
    public @ResponseBody
    ArrayList<UserEntity> getUserList()
    {
        System.out.println("UserController: getUserList: START");
        ArrayList<UserEntity> userEntityList = (ArrayList)      service.getAllUsers();
        return userEntityList;
    }

    @RequestMapping(value = "/", method = RequestMethod.GET, headers = "Accept=application/json")
    public @ResponseBody
ArrayList<UserEntity> getAllUsers()
    {
        System.out.println("UserController: getAllUsers: START");
        ArrayList<UserEntity> userEntityList = (ArrayList)      service.getAllUsers();
        return userEntityList;
    }

我有一个测试,当我用 maven 构建应用程序时会运行,这很好用:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations =

{ "classpath:/spring/angular-context.xml", "file:src/main/webapp/WEB-INF/springmvc-servlet.xml" }) @Transactional 公共类 BaseControllerTests 扩展 TestCase {

@Test
public void testMockGetUserList1() throws Exception
{
    MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/users/");
        this.mockMvc.perform(requestBuilder).andDo(print()).andExpect(status().isOk());
    }

@Test
public void testMockGetUserList2() throws Exception
{
    MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/users");
        this.mockMvc.perform(requestBuilder).andDo(print()).andExpect(status().isOk());
}
}

web-xml 文件如下所示:

<web-app>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring/angular-context.xml</param-value>
</context-param>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:/logging/log4j-config.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Servlets -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>jUnitHostImpl</servlet-name>
    <servlet-class>com.google.gwt.junit.server.JUnitHostImpl</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>jUnitHostImpl</servlet-name>
    <url-pattern>/SoccerApp/junithost/*</url-pattern>
</servlet-mapping>

<!-- Default page to serve -->
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

</web-app>

而 angular-context.xml 文件看起来像:

<?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:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:util="http://www.springframework.org/schema/util" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.2.xsd
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">

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

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
        <value>jdbc:mysql://localhost:3306/phonebook</value>
    </property>
    <property name="username">
        <value>myusername</value>
    </property>
    <property name="password">
        <value>mypassword</value>
    </property>

</bean>

<!-- JNDI DataSource for Java EE environments -->
<!-- <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/MyDatabase"/> -->


<!-- Hibernate SessionFactory -->

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

    <property name="packagesToScan" value="com.tomholmes.angularjs.phonebook.domain" />

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
        </props>
    </property>
    <property name="dataSource" ref="dataSource" />
</bean>


<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="mail.tomholmes.net" />
    <property name="port" value="587" />

    <property name="username" value="myusername" />
    <property name="password" value="mypassword" />

    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.starttls.enable">true</prop>
        </props>
    </property>
</bean>

<!--  
<bean id="sendMailService" class="com.tomholmes.angularjs.phonebook.shared.util.SendEmailService">
    <property name="mailSender" ref="mailSender" />
</bean>
-->

<bean id = "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager">
     <property name = "sessionFactory" ref = "sessionFactory" />
</bean>

<!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

所以,这个项目在 maven 下编译就好了。在使用 Tomcat 8 引擎的 eclipse (STS) 下,它运行良好,我可以转到我的应用程序: http://localhost:8080/angularjs-phone-book/ 我可以很好地看到 index.html,所以我知道应用程序就在那里。

如果我去:

 http://localhost:8080/angularjs-phone-book/users
 http://localhost:8080/angularjs-phone-book/users/
 http://localhost:8080/angularjs-phone-book/rest/users
 http://localhost:8080/angularjs-phone-book/rest/users/

没有任何效果,我收到一个 404 错误,提示找不到此 Web 服务。 但就像我说的,我知道测试有效,但我看不到到达那里的确切 URL。

我尝试直接在 Tomcat 8 上部署 WAR,但这个网络应用程序甚至无法从那里启动,可能是因为日志记录问题。

如果我可以提供更多信息,请告诉我。找到这个的任何帮助都会很棒。最终,我希望在前端有一个与 Web 服务相关联的 AngularJS UI,我必须首先让 Web 服务工作。

谢谢!

【问题讨论】:

    标签: eclipse spring rest tomcat8


    【解决方案1】:

    您可能会错过 web.xml 中的 Spring 配置参考。单元测试运行是因为您直接在此处提供对 XML 的引用,而不是在 web.xml 中,因此 Spring 不会扫描您的控制器以查找注释。

    &lt;servlet&gt; 中使用&lt;init-param&gt;

    而正确的 URL 将是最后一个,也就是 .../rest/users/,而且 .../rest/users 也是在浏览器的帮助下允许的,我猜。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多