Java 弹簧HATEOAS插孔2模块

Java 弹簧HATEOAS插孔2模块,java,spring-hateoas,Java,Spring Hateoas,假设我不想使用spring-hateoas中的ResourceSupport,但我仍然想使用Link 基本设置: class A extends ResourceSupport { } public class B { private final List<Link> links = new ArrayList<>(); @JsonProperty("links") public List<Link> getLinks() {

假设我不想使用
spring-hateoas
中的
ResourceSupport
,但我仍然想使用
Link

基本设置:

class A extends ResourceSupport {

}

public class B {

    private final List<Link> links = new ArrayList<>();

    @JsonProperty("links")
    public List<Link> getLinks() {
        return links;
    }
}
和分别来自
a
b
的响应:

http://localhost:8080/api/a
{
  "_links": {
    "index": {
      "href": "/api"
    }
  }
}

http://localhost:8080/api/b
{
  "links": [
    {
      "href": "/api"
    }
  ]
}
/a
响应非常完美!为什么在没有资源支持的情况下,
Jackson2HalModule
不选择
spring hateoas
链接
列表? 我尝试了一点调试,但对Jackson如何在内部决定何时使用HalLinkListDeserializer和何时不使用感到困惑。

尝试以下方法:

@SpringBootApplication
@RestController
public class DemoApplication implements Jackson2ObjectMapperBuilderCustomizer {

    @Autowired
    private RelProvider relProvider;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping("/a")
    ResponseEntity<A> getA() {
        A a = new A();
        a.getLinks().add(new Link("/api", "index"));
        return ResponseEntity.ok(a);
    }

    @GetMapping("/b")
    ResponseEntity<B> getB() {
        B b = new B();
        b.getLinks().add(new Link("/api", "index"));
        return ResponseEntity.ok(b);
    }

    @Override
    public void customize(final Jackson2ObjectMapperBuilder mapperBuilder) {
        mapperBuilder.mixIn(B.class, BMixin.class);
        mapperBuilder.handlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(relProvider, null, null));
        mapperBuilder.modulesToInstall(new Jackson2HalModule());
    }

    static class A extends ResourceSupport {
    }

    static class B {
        private final List<Link> links = new ArrayList<>();

        public List<Link> getLinks() {
            return links;
        }
    }

    static abstract class BMixin extends B {

        @Override
        @XmlElement(name = "link")
        @JsonProperty("_links")
        @JsonInclude(JsonInclude.Include.NON_EMPTY)
        @JsonSerialize(using = Jackson2HalModule.HalLinkListSerializer.class)
        @JsonDeserialize(using = Jackson2HalModule.HalLinkListDeserializer.class)
        public abstract List<Link> getLinks();

    }

}
@springboot应用程序
@RestController
公共类DemoApplication实现Jackson2ObjectMapperBuilderCustomizer{
@自动连线
私人关系提供者关系提供者;
公共静态void main(字符串[]args){
run(DemoApplication.class,args);
}
@GetMapping(“/a”)
响应getA(){
A=新的A();
a、 添加(新链接(“/api”,“index”);
返回响应度ok(a);
}
@GetMapping(“/b”)
响应getB(){
B=新的B();
b、 添加(新链接(“/api”,“index”);
返回响应度ok(b);
}
@凌驾
公共void自定义(最终Jackson2ObjectMapperBuilder mapperBuilder){
mapperBuilder.mixIn(B.class,BMixin.class);
mapperBuilder.handlerInstantiator(新的Jackson2HalModule.HalHandlerInstantiator(relProvider,null,null));
模块安装(新Jackson2HalModule());
}
静态类A扩展了ResourceSupport{
}
静态B类{
私有最终列表链接=新建ArrayList();
公共列表getLinks(){
返回链接;
}
}
静态抽象类BMixin扩展了B{
@凌驾
@xmlement(name=“link”)
@JsonProperty(“\u链接”)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonSerialize(使用=Jackson2HalModule.HalLinkListSerializer.class)
@JsonDeserialize(使用=Jackson2HalModule.HalLinkListDeserializer.class)
公共摘要列表getLinks();
}
}
http://localhost:8080/api/a
{
  "_links": {
    "index": {
      "href": "/api"
    }
  }
}

http://localhost:8080/api/b
{
  "links": [
    {
      "href": "/api"
    }
  ]
}
@SpringBootApplication
@RestController
public class DemoApplication implements Jackson2ObjectMapperBuilderCustomizer {

    @Autowired
    private RelProvider relProvider;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping("/a")
    ResponseEntity<A> getA() {
        A a = new A();
        a.getLinks().add(new Link("/api", "index"));
        return ResponseEntity.ok(a);
    }

    @GetMapping("/b")
    ResponseEntity<B> getB() {
        B b = new B();
        b.getLinks().add(new Link("/api", "index"));
        return ResponseEntity.ok(b);
    }

    @Override
    public void customize(final Jackson2ObjectMapperBuilder mapperBuilder) {
        mapperBuilder.mixIn(B.class, BMixin.class);
        mapperBuilder.handlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(relProvider, null, null));
        mapperBuilder.modulesToInstall(new Jackson2HalModule());
    }

    static class A extends ResourceSupport {
    }

    static class B {
        private final List<Link> links = new ArrayList<>();

        public List<Link> getLinks() {
            return links;
        }
    }

    static abstract class BMixin extends B {

        @Override
        @XmlElement(name = "link")
        @JsonProperty("_links")
        @JsonInclude(JsonInclude.Include.NON_EMPTY)
        @JsonSerialize(using = Jackson2HalModule.HalLinkListSerializer.class)
        @JsonDeserialize(using = Jackson2HalModule.HalLinkListDeserializer.class)
        public abstract List<Link> getLinks();

    }

}