Spring Data Rest有利于实现架构的读写分离,学习CQRS模式的基础,在springcloud中我们项目通过feign进行微服的调用,但是,比如一个findOne或list的查询,需要从controller写到dao层,还需提供feign接口,很是麻烦,如果使用Spring Data Rest进行命令查询的责任分离,命令改变对象状态的操作.
Spring Data Rest默认会为每一个Repository创建基于该实体s(例如users)的查询连接,支持JPA的属性命名查询,使用@Param注解接收客户端传来的参数
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
踩坑记录:
我们的项目中使用的是Jackson,在全局yml文件中配置了jackson默认的时间解析方式,使用RestTemplate序列化实体对象的Date属性时会报错
解决办法:
1.注释掉全局yml配置的jackson时间解析格式,配置ObjectMapper时间解析 ------- 不采用这个
2.继承JsonDeserializer<Date>重写deserialize方法
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = jp.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
且在setter上加上注解
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
3.配置RestTemplate支持HAL/JSON格式
@Configuration
public class RestTemplateConfig {
@Autowired
private ObjectMapper objectMapper;
@Bean
public RestTemplate restTemplate() {
// converter
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(HAL_JSON));
converter.setObjectMapper(objectMapper);
RestTemplate restTemplate = new RestTemplate(Collections.singletonList(converter));
return restTemplate;
}
4.RestTemplate访问Spring Data Rest获取集合示例
// for a collection
ParameterizedTypeReference<PagedResources<DataRest>> responseType =
new ParameterizedTypeReference<PagedResources<DataRest>>() {};
// GET
PagedResources<DataRest> page = restTemplate.exchange(url, HttpMethod.GET, null, responseType).getBody();