Custom RepositoryRestController映射url在spring-data-rest

时间:2016-11-08 06:40:31

标签: controller spring-data-jpa spring-data-rest

我使用相应的实体存储库编写了自定义RepositoryRestController。在此URL上执行请求时,查询正在我的控制台中运行,但是url返回404.我还能够在日志中看到此url的requestHandlerMapping。请参阅我的以下代码段。

存储库:

   @RepositoryRestResource
    public interface FooRepository extends BaseRepository<Foo, Integer> {
    @RestResource(exported = false)
    List<Foo> findByName(String name);
    }

控制器:

@RepositoryRestController
public class FooResource {
@Aurowired
FooRepository fooRepository;

@Autowired
RestApiService restApiService;

@RequestMapping(value = "/foos/search/byApiName", method = GET)
public ResponseEntity<?> findByApiName(String name) {
List<String> apiNames = restApiService.getNameLike(name);
List<Foo> fooList = fooRepository.findByName(name);

List<String> fooNames = // list of names from fooList
...
System.out.println("FETCHING apiNames");
return apiNames;
}

当我执行以下curl命令时

curl -X GET http:localhost:8080/foos/search/byApiName

响应返回404错误。我不知道为什么。但他的打印声明是在控制台中打印的。

@hat我在这里做错了吗?

2 个答案:

答案 0 :(得分:6)

我建议您需要将@ResponseBody添加到您的方法或返回值(如SDR示例http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.overriding-sdr-response-handlers中)或将您的列表包装在ResponseEntity中。

不确定这些方法之间是否存在任何差异,但所有这些都应该如Spring MVC文档中所述:

  

“表示返回类型应直接写入HTTP   响应体(而不是放在模型中,或[被]解释为视图   名)“。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

鉴于你的调试语句打印,但你得到一个404,看起来后一个动作就是这样。

@RequestMapping(value = "/foos/search/byApiName", method = GET)
@ResponseBody
public ResponseEntity<?> findByApiName(String name) {
    // ....
}

,或者

@RequestMapping(value = "/foos/search/byApiName", method = GET)
public @ResponseBody ResponseEntity<?> findByApiName(String name) {
   //....
}

,或者

@RequestMapping(value = "/foos/search/byApiName", method = GET)
public ResponseEntity<List<String>> findByApiName(String name) {
   //....

  return new ResponseEntity<List<String>>(fooNames, HttpStatus.OK);
}

答案 1 :(得分:3)

我发现控制器需要注释@RequestMapping,否则会被忽略。以下是我的代码:

@RepositoryRestController
@RequestMapping("/security")
public class ...

这适合我。