在简单的Spring4REST服务上获得404

在简单的Spring4REST服务上获得404,spring,rest,Spring,Rest,我正在尝试访问我编写的RESTful web服务: http://localhost:8080/dukegen/ws/family/1 但是使用浏览器中的地址栏获取404却不知道原因。我正在尝试返回JSON。我已将Jackson 2放在我的课程路径上: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind<

我正在尝试访问我编写的RESTful web服务:

http://localhost:8080/dukegen/ws/family/1
但是使用浏览器中的地址栏获取404却不知道原因。我正在尝试返回JSON。我已将Jackson 2放在我的课程路径上:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.3.1</version>
</dependency>
这是我的控制器:

@Controller
@RequestMapping("ws")
public class FamilyResource {

    @RequestMapping(value="family/{familyId}", method = RequestMethod.GET, produces="application/json")
    public @ResponseBody Family getFamily(@PathVariable long familyId) {
            .... builds Family object ....
             return family;
         }

}
以下是我在web.xml中设置的dispatcher:

 <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/mvcContext.xml</param-value>
        </init-param>
  </servlet>

  <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/ws/*</url-pattern>
  </servlet-mapping>

调度员
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
类路径:/mvcContext.xml
调度员
/ws/*
My mvcContext.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="ws.hamacher.dukegen.resource"/>

</beans>


任何帮助都将不胜感激。

这里有两件事是不正确的

首先,在请求映射中,映射应该是一致的。 类应该映射到
“/ws”
,而生成结果的方法应该是
“/family/{familyId}”

在web.xml中,您已将servlet配置为响应
/ws/*
,并且您的控制器请求再次映射到
ws
。这不起作用

一旦servlet拦截了
“/ws/*”
,就不应该在请求映射中重复。控制器只响应其上下文中的URL模式。URL中
“/ws”
之后的内容仅在控制器的上下文中

我通常喜欢将servlet映射到
“/”
,并在控制器中编码所有其他分辨率。不过,这只是我的偏好

因此,正确的配置是

web.xml

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/mvcContext.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

在stackoverflow中的几个帖子中搜索后,没有找到决定性的答案,下面是我验证的内容:

1) 如果以这种方式在请求映射中设置:“/rest/*”、在web.xml中或在“AbstractAnnotationConfigDispatchersServletilizer”类的“getServletMappings”方法中,请不要在RestController的RequestMapping中定义相同的上下文名称

MySpringMvcDispatcherServletInitializer.java

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MySpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { DemoAppConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/rest/*" };
    }
}   
如果在RestController类的RequestMapping中重复“/rest”,它将不起作用。尝试访问url时,您将收到404错误:

2) 当我们在请求映射中定义“/rest/*”时,我们向Servlet调度器指示,从这个上下文中“/rest”一切都将由它处理。因此,通过删除“/rest”来更改RestController的映射。输入另一个映射,例如“/test”:

DemoRestController.java

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value="/rest")
public class DemoRestController {

    // add code for the "/hello" endpoint

    @GetMapping(value="/hello")
    public String sayHello() {
        return "Hello World!";
    }   
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value="/test")
public class DemoRestController {

    // add code for the "/hello" endpoint

    @GetMapping(value="/hello")
    public String sayHello() {
        return "Hello World!";
    }   
}
3) 现在,使用URL访问rest服务:

这应该很好用


希望这能有所帮助。

我有一个静态文件,我也想托管它,但url模式中的斜杠与所有内容都匹配,这使我无法这样做。所以我不得不使用不同的url映射,比如
ws
。谢谢
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value="/rest")
public class DemoRestController {

    // add code for the "/hello" endpoint

    @GetMapping(value="/hello")
    public String sayHello() {
        return "Hello World!";
    }   
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value="/test")
public class DemoRestController {

    // add code for the "/hello" endpoint

    @GetMapping(value="/hello")
    public String sayHello() {
        return "Hello World!";
    }   
}