2017-06-10 44 views
0

我试图使用两个控制器来处理我的Spring应用程序的请求,但无法按预期工作:如何在Spring应用程序中使用多个控制器?

控制器1正确处理请求:

@Controller 
@RequestMapping("/appclient") 
public class Controller1 { 
    ... 
} 

控制器2不处理任何消息:

@Controller 
@RequestMapping("/webclient") 
public class Controller2 { 

    @RequestMapping(value = "/product", method = RequestMethod.GET) 
    public ModelAndView addProduct() { 
     // Do something 
    } 
} 

我使用Postman来测试我的应用程序,我得到跟随错误,这意味着没有为“/ webclient/product”定义控制器操作,这是不正确的。

{ 
    "timestamp": 1497048933216, 
    "status": 404, 
    "error": "Not Found", 
    "message": "No message available", 
    "path": "/webclient/product" 
} 

如果我修改控制器1,以便它可以处理“/ Web客户端/产品”,它的工作原理,但不是我想这样做的方式。

任何想法为什么Controller2不工作?

编辑:这里是主类

@SpringBootApplication 
public class MyServerApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(MyServerApplication.class, args); 
    } 
} 
+0

似乎有没有在你的定义中的问题,您使用的春天启动WS?你可以添加主类吗? – German

+0

你会得到什么异常或堆栈跟踪。这是一个很好的[post](https://stackoverflow.com/questions/19068530/how-to-map-multiple-controllers-in-spring-mvc),你可以参考。 –

+2

控制器是否在同一个包装内? – Strelok

回答

0

我已经发现我的问题了,我很愚蠢......我忘了在我的pom.xml中包含Thymeleaf依赖项。

控制器1工作,因为它是一个RESTful服务,它不依赖于Thymeleaf,但控制器2是基于MVC和无法找到模板等,返回了错误。

添加这种依赖性解决我的问题:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-thymeleaf</artifactId> 
</dependency> 
+0

对于那些需要它的控制器使用新的@ RestController是个好习惯。清楚表明它是一个其余的API控制器,并且还可以节省您打字的时间,因为您不需要在方法中添加“@ ResponseBody” – Strelok

0

在控制器2,你想返回一个HTTP响应,这样的事情:

@Controller 
@RequestMapping("/webclient") 
public class Controller2 { 

    @RequestMapping(value = "/product", method = RequestMethod.GET) 
    public ResponseEntity<?> addProduct() { 
     HttpHeaders header = new HttpHeaders(); 
     header.add("Content-Type", "application/json"); 
     return new ResponseEntity<>(header, HttpStatus.OK); 
    } 
} 

从维基:

HTTP作为客户端服务器中的请求 - 响应协议 计算模型

这样说,你不能只是返回void。 HTTP是基于请求 - 响应的,因此,您必须返回响应。

404意味着没有找到HTTP,换句话说,POSTMAN找不到这个处理程序。

尝试添加主机,是这样的:

http://localhost:8080/webclient/product 

,并确保你使用GET方法像你提到的。

+0

这是我在复制代码时的错误。它返回一个'ModelAndView'对象,它现在已经被修正了。然而,你的回答帮助我意识到我的问题是什么。我已经发布并回复,非常感谢! –

+0

将投票赞赏谢谢... @DiegoMoreno –

相关问题