令人费解的REST控制器映射

问题描述:

我有几个映射一个REST控制器:令人费解的REST控制器映射

@RequestMapping(params = {"technicianId", "teamId"}, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public ResponseEntity<TeamTechnicianResource> findByTeamAndTechnician(@RequestParam(value = "teamId", required = true) Long teamId, @RequestParam(value = "technicianId", required = true) Long technicianId, UriComponentsBuilder builder) { 
    logger.debug("============>>> teamId: " + teamId + " technicianId: " + technicianId); 
    HttpHeaders responseHeaders = new HttpHeaders(); 
    TeamTechnician foundTeamTechnician = teamTechnicianService.findByTeamAndTechnician(teamId, technicianId); 
    TeamTechnicianResource teamTechnicianResource = teamTechnicianResourceAssembler.toResource(foundTeamTechnician); 
    responseHeaders.setLocation(builder.path(UriMappingConstants.PATH_SEPARATOR + UriMappingConstants.TEAM_TECHNICIANS).queryParam("teamId", teamId).queryParam("technicianId", technicianId).buildAndExpand().toUri()); 
    return new ResponseEntity<TeamTechnicianResource>(teamTechnicianResource, responseHeaders, HttpStatus.OK); 
} 

@RequestMapping(params = "technicianId", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public ResponseEntity<PagedResources<TeamTechnicianResource>> findByTechnician(@RequestParam(value = "technicianId", required = true) Long technicianId, Pageable pageable, PagedResourcesAssembler<TeamTechnician> pagedResourcesAssembler, UriComponentsBuilder builder) { 
    HttpHeaders responseHeaders = new HttpHeaders(); 
    Page<TeamTechnician> foundTeamTechnicians = teamTechnicianService.findByTechnician(technicianId, pageable); 
    responseHeaders.setLocation(builder.path(UriMappingConstants.PATH_SEPARATOR + UriMappingConstants.TEAM_TECHNICIANS).queryParam("technicianId", technicianId).queryParam("page", pageable.getPageNumber()).queryParam("size", pageable.getPageSize()).buildAndExpand().toUri()); 
    Link selfLink = linkTo(methodOn(TeamTechnicianController.class).findByTechnician(technicianId, pageable, pagedResourcesAssembler, builder)).withRel("findByTechnician"); 
    PagedResources<TeamTechnicianResource> teamTechnicianPagedResources = pagedResourcesAssembler.toResource(foundTeamTechnicians, teamTechnicianResourceAssembler, selfLink); 
    return new ResponseEntity<PagedResources<TeamTechnicianResource>>(teamTechnicianPagedResources, responseHeaders, HttpStatus.OK); 
} 

@RequestMapping(params = "teamId", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public ResponseEntity<PagedResources<TeamTechnicianResource>> findByTeam(@RequestParam(value = "teamId", required = true) Long teamId, Pageable pageable, PagedResourcesAssembler<TeamTechnician> pagedResourcesAssembler, UriComponentsBuilder builder) { 
    HttpHeaders responseHeaders = new HttpHeaders(); 
    Page<TeamTechnician> foundTeamTechnicians = teamTechnicianService.findByTeam(teamId, pageable); 
    responseHeaders.setLocation(builder.path(UriMappingConstants.PATH_SEPARATOR + UriMappingConstants.TEAM_TECHNICIANS).queryParam("teamId", teamId).queryParam("page", pageable.getPageNumber()).queryParam("size", pageable.getPageSize()).buildAndExpand().toUri()); 
    Link selfLink = linkTo(methodOn(TeamTechnicianController.class).findByTeam(teamId, pageable, pagedResourcesAssembler, builder)).withRel("findByTeam"); 
    PagedResources<TeamTechnicianResource> teamTechnicianPagedResources = pagedResourcesAssembler.toResource(foundTeamTechnicians, teamTechnicianResourceAssembler, selfLink); 
    return new ResponseEntity<PagedResources<TeamTechnicianResource>>(teamTechnicianPagedResources, responseHeaders, HttpStatus.OK); 
} 

当请求仅当与teamId参数的第三映射中不存在控制器与两个参数的第一映射响应细。

否则,例外的是:

java.lang.NoSuchMethodError: org.springframework.http.MediaType.compareTo(Lorg/springframework/http/MediaType;)I 

与technicianId第二映射请求时总是响应罚款。

第三次与teamId的映射在请求时总是很好地响应。

我使用Spring 4.0.7.RELEASE和安全3.2.5.RELEASE在Tomcat 7

任何线索?

+0

**您希望每种方法都响应哪些网址**? *(顺便说一句,你的控制器知道的太多了,我会把一些逻辑移到服务上,尽可能地减少控制器的数量。你测试这些方法吗?测试会“尖叫”我想说的。 )* – acdcjunior 2014-09-07 16:49:44

+0

这些网址指示映射。说:teamtechnicians?technicianId = 1&teamId = 1我的控制器处理程序正在呼叫他们的服务。我看不到作为服务一部分的头文件或资源汇编程序。你还会在服务中看到什么? – Stephane 2014-09-07 18:41:00

+0

我刚试过一些东西。我将第三个控制器处理程序中的teamId参数重命名为myteamId参数,现在所有处理程序都正常工作。我不能相信这个问题来自参数的名称。是什么赋予了 ? – Stephane 2014-09-07 18:43:10

正如JIRA问题所述,这不是一个框架问题,而是一个依赖管理问题。

在这个项目中,Spring Framework的多个(和不兼容!)版本位于类路径上:3.2.8和4.0.7。使用Spring Framework's "Bill Of Materials"是预防未来这些问题的好方法。