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();
}
}