使用 Spring 数据 Rest 手动将 JSON 转换为对象
Manually convert JSON to Object using Spring Data Rest
假设我有以下实体:
public class Employee {
private String name;
private Company company
}
我有一个包含以下内容的字符串:
{
"name":"Joe",
"company": "http://localhost/companies/23"
}
Spring Data Rest 能够立即将此 JSON 转换为 Employee 对象,但如何手动转换?
@Aurowired
private final RepositoryInvokerFactory repositoryInvokerFactory;
private Object loadPropertyValue(Class<?> type, String href) {
String id = href.substring(href.lastIndexOf('/') + 1);
RepositoryInvoker invoker = repositoryInvokerFactory.getInvokerFor(type);
return invoker.invokeFindById(id).orElse(null);
}
好的。我想我现在明白了这个问题。当然,SDR 必须有一个 ObjectMapper,它能够将传入的 JSON 转换为一个实体(包括 hateoas 链接),但它似乎不是默认的 ObjectMapper,它甚至没有作为 Bean 导出。
所以我做了一些逆向工程,我想我已经找到了你需要的东西。好在内部使用的ObjectMapper在RepositoryRestMvcConfiguration
class中有一个publicgetter
,所以用起来很方便:
/**
* The Jackson {@link ObjectMapper} used internally.
*
* @return
*/
public ObjectMapper objectMapper() {
return mapper.get();
}
我认为以下代码可以工作:
@Autowired
RepositoryRestMvcConfiguration rrmc;
private <T> T readValue(String json, Class<T> type)
throws IOException, JsonParseException, JsonMappingException {
return rrmc.objectMapper().readValue(json, type);
}
假设我有以下实体:
public class Employee {
private String name;
private Company company
}
我有一个包含以下内容的字符串:
{
"name":"Joe",
"company": "http://localhost/companies/23"
}
Spring Data Rest 能够立即将此 JSON 转换为 Employee 对象,但如何手动转换?
@Aurowired
private final RepositoryInvokerFactory repositoryInvokerFactory;
private Object loadPropertyValue(Class<?> type, String href) {
String id = href.substring(href.lastIndexOf('/') + 1);
RepositoryInvoker invoker = repositoryInvokerFactory.getInvokerFor(type);
return invoker.invokeFindById(id).orElse(null);
}
好的。我想我现在明白了这个问题。当然,SDR 必须有一个 ObjectMapper,它能够将传入的 JSON 转换为一个实体(包括 hateoas 链接),但它似乎不是默认的 ObjectMapper,它甚至没有作为 Bean 导出。
所以我做了一些逆向工程,我想我已经找到了你需要的东西。好在内部使用的ObjectMapper在RepositoryRestMvcConfiguration
class中有一个publicgetter
,所以用起来很方便:
/**
* The Jackson {@link ObjectMapper} used internally.
*
* @return
*/
public ObjectMapper objectMapper() {
return mapper.get();
}
我认为以下代码可以工作:
@Autowired
RepositoryRestMvcConfiguration rrmc;
private <T> T readValue(String json, Class<T> type)
throws IOException, JsonParseException, JsonMappingException {
return rrmc.objectMapper().readValue(json, type);
}