在Spring Data Rest中返回纯JSON

时间:2018-10-07 15:32:56

标签: java json spring spring-boot spring-data-rest

有人知道一种配置Spring Data Rest的方法,以便它返回纯JSON实体而不是HAL吗?

具有一个带有Spring Data REST和MongoDB的Spring Boot应用程序,我想返回以下内容:

[ 
  {
      "name" : "Leonid",
    "address" : {
      "city" : "My city",
      "street" : "My st.",
      "house" : 1
    }
  } 
]

代替此:

{
  "_embedded" : {
    "persons" : [ {
      "name" : "Leonid",
      "address" : {
        "city" : "My city",
        "street" : "My st.",
        "house" : 1
      },
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/persons/5bba258c85c61305d4add5f1"
        },
        "person" : {
          "href" : "http://localhost:8080/persons/5bba258c85c61305d4add5f1"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/persons{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile/persons"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}

我已经尝试使用spring.hateoas.use-hal-as-default-json-media-type=falsespring.data.rest.defaultMediaType=application/json,但是这些属性都根本不会影响查找所有端点。另外,我尝试扩展RepositoryRestConfigurer并在那里配置相同的选项,但随后我开始收到这样的响应:

{
  "links" : [ {
    // some stuff
  }, {
    // some stuff
  } ],
  "content" : [ {
    "name" : "Leonid",
    "address" : {
      "city" : "Saint Petersburg",
      "street" : "Zastavskay st.",
      "house" : 22,
      "content" : [ ],
      "links" : [ ]
    },
    "content" : [ ],
    "links" : [ {
    // some stuff
    }, {
    // some stuff
    } ]
  } ],
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}

UPD:

这是文档:

@Document
@Data
public class Person {
    @Id
    @JsonIgnore
    private String id;
    private String name;
    private Address address;
}

然后回购:

@RepositoryRestResource
public interface PersonRepository extends MongoRepository<Person, String> {
}

1 个答案:

答案 0 :(得分:-1)

您可以使用Payload类来接收/发送所需的键/值对。

基本上,使用getter和setter创建具有所需值的POJO,并使用所需的任何验证约束注释。

null

然后在控制器上,只需返回带有有效负载的ResponseEntity。

public class personResponsePayload
{
    @NotBlank
    private String id;
    @NotBlank
    private String name;
    @NotBlank
    private Address address;

    // Constructor + Getters and Setters
}

杰克逊将处理其他所有事务。此过程可以同时处理请求和响应。