Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringDataREST:如何在HAL浏览器中公开自定义Rest控制器方法_Spring_Spring Data Rest - Fatal编程技术网

SpringDataREST:如何在HAL浏览器中公开自定义Rest控制器方法

SpringDataREST:如何在HAL浏览器中公开自定义Rest控制器方法,spring,spring-data-rest,Spring,Spring Data Rest,我已经创建了一个自定义rest控制器,我可以访问API并从资源中获取结果,问题是,它不会出现在HAL浏览器中。。如何在HAL浏览器中公开此自定义方法?谢谢你 @RepositoryRestController public class RevisionController { protected static final Logger LOG = LoggerFactory .getLogger(RevisionController.class); p

我已经创建了一个自定义rest控制器,我可以访问API并从资源中获取结果,问题是,它不会出现在HAL浏览器中。。如何在HAL浏览器中公开此自定义方法?谢谢你

@RepositoryRestController
public class RevisionController {

    protected static final Logger LOG = LoggerFactory
            .getLogger(RevisionController.class);

    private final DisciplineRepository repository;

    Function<Revision<Integer, Discipline>, Discipline> functionDiscipline = new Function<Revision<Integer, Discipline>, Discipline>() {
        @Override
        public Discipline apply(Revision<Integer, Discipline> input) {
            return (Discipline) input.getEntity();
        }
    };

    @Inject
    public RevisionController(DisciplineRepository repository) {
        this.repository = repository;
    }

    @RequestMapping(method = RequestMethod.GET, value = "/disciplines/search/{id}/revisions")
    public @ResponseBody ResponseEntity<?> getRevisions(
            @PathVariable("id") Integer id) {

        Revisions<Integer, Discipline> revisions = repository.findRevisions(id);

        List<Discipline> disciplines = Lists.transform(revisions.getContent(),
                functionDiscipline);

        Resources<Discipline> resources = new Resources<Discipline>(disciplines);

        resources.add(linkTo(
                methodOn(RevisionController.class).getRevisions(id))
                .withSelfRel());

        return ResponseEntity.ok(resources);
    }


}
@RepositoryRestController
公共类修改控制器{
受保护的静态最终记录器日志=LoggerFactory
.getLogger(修订控制器类);
私人最终纪律储备库;
函数函数规程=新函数(){
@凌驾
公共纪律申请(修订输入){
返回(规程)输入。getEntity();
}
};
@注入
公共修订控制员(纪律储备库){
this.repository=存储库;
}
@RequestMapping(method=RequestMethod.GET,value=“/productions/search/{id}/revisions”)
public@ResponseBody ResponseEntity getRevisions(
@路径变量(“id”)整数id){
修订版本=repository.findRevisions(id);
列表规程=Lists.transform(revisions.getContent(),
职能(学科);
资源=新资源(学科);
资源。添加(链接到(
methodOn(RevisionController.class).getRevisions(id))
.with selfrel());
返回ResponseEntity.ok(资源);
}
}

注册一个实现
ResourceProcessor
的bean,您可以将自定义控制器的链接添加到根资源,HAL浏览器将看到它

public class RootResourceProcessor implements ResourceProcessor<RepositoryLinksResource> {

@Override
public RepositoryLinksResource process(RepositoryLinksResource resource) {
    resource.add(ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(RevisionController.class).getRevisions(null)).withRel("revisions"));
    return resource;
    }
}
公共类RootResourceProcessor实现ResourceProcessor{
@凌驾
公共RepositoryLinksResource进程(RepositoryLinksResource资源){
add(ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(RevisionController.class).getRevisions(null)).withRel(“revisions”);
返回资源;
}
}

我正在尝试,但在
java.lang.IllegalArgumentException时失败:“uriTemplate”不能为null
。(在
getRevisions()
之后,您的代码似乎缺少一个关闭参数)谢谢Eric,我已经修改了代码。至于你的问题-你能发布一个更完整的堆栈跟踪吗?您可以通过让自定义控制器类实现ResourceProcessor接口而不是一个独立的类来解决这个问题-在其他地方对此进行了一些讨论()。现在,我得到了
java.util.NoSuchElementException:ArrayList:854 Collections:1042 ControllerLinkBuilderFactory:139[spring hateoas]ControllerLinkBuilder:172 RootResourceProcessor:22)
其中包含
资源。添加(链接到(methodOn(MeetupController.class,2L,3L,2d,2d,null,null)。最终确定(2L,3L,2d,2d,null)).withRel(“meetups”)(堆栈被截断以适应注释)而无法查看控制器代码这是很难进一步调试的。我不知道为什么要将这些参数传递给方法两次。你不能这样做吗<代码>资源.add(linkTo(methodOn(MeetupController.class).finalize(2L,3L,2d,2d,null,null)).withRel(“meetups”)(由于一个我认为正在修复的问题,我已经两次传递了params)。是的-再次调整它(显然修复了其他问题)会使该方法暴露在HAL浏览器上。但是,(1)在顶层,而不是我想要的位置,即/meetups/finalize,(2)参数是硬编码到上面的那些参数,而不是模板化的,(3)我希望它只能作为POST(非GET)提供