我尝试用spring hateoas创建一个简单的控制器。
控制器如下所示:
@RestController
public class SearchController {
private final List<Plugin> plugins;
@Autowired
public SearchController(List<Plugin> plugins) {
this.plugins = plugins;
}
@GetMapping("/search")
public CollectionModel<PluginDTO> search(
@RequestParam(value = "name", defaultValue = "") String name) {
List<PluginDTO> pluginsDTO = this.plugins.stream()
.filter(plugin -> {
if(name.isBlank()) { // No filter case.
return true;
}
return plugin.getName().toLowerCase(Locale.ROOT).contains(name.toLowerCase(Locale.ROOT));
})
.map(plugin -> new PluginDTO(plugin.getName(), plugin.getDescription(),
plugin.getCapacities().stream().map(c -> new CapacityDTO(c.getName(), c.getDescription())).toList())
.add(
linkTo(methodOn(SearchController.class).one(plugin.getName())).withSelfRel(),
linkTo(methodOn(SearchController.class).search(name)).withRel("search"))
)
.toList();
Link link = linkTo(methodOn(SearchController.class).search(name)).withSelfRel();
return CollectionModel.of(pluginsDTO, link);
}
@GetMapping("/plugin")
private PluginDTO one(@RequestParam(value = "name") String name) {
return this.plugins.stream().filter(plugin -> plugin.getName().equals(name)).findFirst()
.map(plugin -> new PluginDTO(plugin.getName(), plugin.getDescription(),
plugin.getCapacities().stream().map(c -> new CapacityDTO(c.getName(), c.getDescription())).toList())
.add(
linkTo(methodOn(SearchController.class).one("")).withSelfRel(),
linkTo(methodOn(SearchController.class).search("")).withRel("search"))
)
.orElseThrow(() -> new PluginNotFoundException(name));
}
}
使用这段代码linkTo(methodOn(SearchController.class).get(plugin.getName())).withSelfRel()
Spring调用方法on()
并在this.plugin
上抛出一个NPE
。看起来@Autowire
在这种情况下没有被解析。
在官方文件中:https://spring.io/guides/tutorials/rest/注射似乎有效
知道为什么会这样吗?
1条答案
按热度按时间qxgroojn1#
好的,我错过了
one
方法的private
限定符的使用。将方法公开解决了这个问题。