在简单的Spring4REST服务上获得404
我正在尝试访问我编写的RESTful web服务:在简单的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<
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!";
}
}