自定义 RepositoryRestController 映射 url 在 spring-data-rest 中抛出 404
Custom RepositoryRestController Mapping url throws 404 in spring-data-rest
我已经使用相应的实体存储库编写了自定义 RepositoryRestController
。对此 url 执行请求时,在我的控制台中查询是 运行,但是 url returns 404。我还可以看到此 [=34= 的 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
响应returns 404错误。我不知道为什么。但是他的打印输出语句正在控制台中打印。
@hat我做错了吗?
我建议您需要将 @ResponseBody
添加到您的方法或 return 值(如 SDR 示例 http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.overriding-sdr-response-handlers 中)或将您的列表包装在响应实体。
不确定这些方法之间是否存在任何差异,但都应该如此,如 Spring MVC 文档中所述:
"indicate that the return type should be written straight to the HTTP
response body (and not placed in a Model, or [be] interpreted as a view
name)."
给定你调试语句打印但你得到一个 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);
}
我发现控制器需要注解@RequestMapping
,否则会被忽略。下面是我的代码:
@RepositoryRestController
@RequestMapping("/security")
public class ...
这对我有用。
我已经使用相应的实体存储库编写了自定义 RepositoryRestController
。对此 url 执行请求时,在我的控制台中查询是 运行,但是 url returns 404。我还可以看到此 [=34= 的 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
响应returns 404错误。我不知道为什么。但是他的打印输出语句正在控制台中打印。
@hat我做错了吗?
我建议您需要将 @ResponseBody
添加到您的方法或 return 值(如 SDR 示例 http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.overriding-sdr-response-handlers 中)或将您的列表包装在响应实体。
不确定这些方法之间是否存在任何差异,但都应该如此,如 Spring MVC 文档中所述:
"indicate that the return type should be written straight to the HTTP response body (and not placed in a Model, or [be] interpreted as a view name)."
给定你调试语句打印但你得到一个 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);
}
我发现控制器需要注解@RequestMapping
,否则会被忽略。下面是我的代码:
@RepositoryRestController
@RequestMapping("/security")
public class ...
这对我有用。