Spring Hateos 2在创建lintTo时未进行注入

mwyxok5s  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(95)

我尝试用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/注射似乎有效
知道为什么会这样吗?

qxgroojn

qxgroojn1#

好的,我错过了one方法的private限定符的使用。将方法公开解决了这个问题。

相关问题