Spring hateoas methodOn with inherited method

时间:2015-08-10 12:50:13

标签: java spring inheritance hateoas spring-hateoas

我正在尝试使用Spring hateoas从抽象控制器中解析继承端点的URL。

我认为首先提供代码会使问题更容易理解。

这是我的抽象控制器:

package com.stackoverflow.question.spring.rest.controllers;

import org.springframework.hateoas.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

public class AbstractController {


    @RequestMapping(value="/cat", method=RequestMethod.GET)
    public Resource<String> cat() {
        return new Resource<>("cat");
    }
}

这是我的控制器使用methodOn:

package com.stackoverflow.question.spring.rest.controllers;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;

import org.springframework.hateoas.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/test", produces = { "application/json; charset=utf-8" })
public class TestController extends AbstractController {

    @RequestMapping(method = RequestMethod.GET)
    public Resource<String> test() {
        return new Resource<>("test", linkTo(
                methodOn(TestController.class).cat()).withRel("cat"), linkTo(
                methodOn(TestController.class).uglyfix()).withRel("uglyfix"));
    }

    @RequestMapping(value = "/uglyfix", method = RequestMethod.GET)
    public Resource<String> uglyfix() {
        return new Resource<>("ugly fix", linkTo(TestController.class).slash(
                "cat").withRel("cat"));
    }

}

这是我进入/ resources / test时得到的:

{
    "content": "test",
    "links": [
        {
            "rel": "cat",
            "href": "http://localhost:8080/resources/cat"
        },
        {
            "rel": "uglyfix",
            "href": "http://localhost:8080/resources/test/uglyfix"
        }
    ]
}

这就是我期望拥有的以及我想要hateoas做的事情:

{
    "content": "test",
    "links": [
        {
            "rel": "cat",
            "href": "http://localhost:8080/resources/test/cat"
        },
        {
            "rel": "uglyfix",
            "href": "http://localhost:8080/resources/test/uglyfix"
        }
    ]
}

当然,我可以做我在端点uglyfix中所做的事情,但我不喜欢这个解决方案,因为它意味着如果我在抽象控制器中更改我的请求映射,我将不得不更改我的TestController的代码。 / p>

也许在我的抽象控制器顶部添加@RequestMapping(value =&#34; test&#34;)将解决我的问题,但我不想要这个解决方案,因为我想使用我的扩展我的抽象控制器不止一个控制器。

有什么干净的方法可以做,我期待什么?

1 个答案:

答案 0 :(得分:1)

我感觉有点愚蠢,因为我只是从0.9.0.RELEASE 0.17.0.RELEASE迁移Spring hateoas并解决了我的问题。