我必须将传入的参数值转换为Repository接口为所需的格式,是否可以这样做。我的域类,
@DynamoDBTable(tableName = "test")
public class Test implements Serializable{
@Id
private String id;
private String name;
private String date;
@DynamoDBHashKey(attributeName = "id")
@DynamoDBAutoGeneratedKey
public String getId() {
return id;
}
@DynamoDBAttribute(attributeName = "name")
public String getName() {
return name;
}
@DynamoDBAttribute(attributeName = "date")
@JsonSerialize(using = StringDateSerializer.class)
public String getDate() {
return date;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
@JsonDeserialize(using = StringDateDeserializer.class)
public void setDate(String date) {
this.date = date;
}
}
我的存储库界面
@EnableScan
@RestResource(path="test", rel="test")
public interface TestRepository extends PagingAndSortingRepository<Test, String>{
@RestResource(path="testsearch", rel="test")
public Page<Test> findByNameAndDateLessThan(@Param("name") String name, @Param("date") String date, Pageable pageable);
}
这里我必须使用Java的getTime()方法将传入日期String转换为时间。是否有可能在不使用控制器的情况下实现这一点,并且不感兴趣从客户端发送,因为可能会出现时区问题。
我的转换器:
public class StringDateSerializer extends JsonSerializer<String> {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
@Override
public void serialize(String time, JsonGenerator gen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
Date date = new Date(Long.parseLong(time));
String formattedDate = dateFormat.format(date);
gen.writeString(formattedDate);
}
}
public class StringDateDeserializer extends JsonDeserializer<String> {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
@Override
public String deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
String dateReceived = parser.getText();
Date date = null;
try {
date = dateFormat.parse(dateReceived);
} catch (ParseException e) {
e.printStackTrace();
}
return String.valueOf(date.getTime());
}
}
我必须使用,GET / test / search / test?name = xx&amp; date = 14-06-2014。我需要获得日期少于14-06-2014的所有名称,并在2014年6月14日或之后离开数据。
在POST和GET时,我已经使用JsonSerialize和JsonDeserialize注释转换了传入和传出的字符串,但是如果我想使用finder方法获取任何数据,它就不会像我想象的那样进行转换。
例如,如果我保存{&#34;名称&#34;:&#34;测试&#34;,&#34;日期&#34;:&#34; 08-10-2014&#34;} ,在数据库中,它将以相等的时间保存,如果我想使用 08-10-2014 而不是时间常数进行搜索。我是泉水的新手,我无法找到适合它的方法。提前谢谢。
答案 0 :(得分:9)
首先使用String
作为日期类型的原因是什么。这非常不理想(用礼貌的方式来说)API设计。
Spring Data REST支持在查询方法参数上使用@DateTimeFormat
,将您从HTTP请求获得的String
基本表示转换为Date
。因此,您的存储库界面可能如下所示:
public interface TestRepository extends PagingAndSortingRepository<Test, String>{
public Page<Test> findByNameAndDate(@Param("name") String name,
@Param("date") @DateTimeFormat(iso = ISO.DATE) Date date, Pageable pageable);
}
这会使String
之类的2014-06-08
转为相应的Date
。
答案 1 :(得分:0)
如果我正确理解您的问题,有两个方面需要关注 - Spring-Data-Rest如何处理日期映射,以及Spring-Data-DynamoDB如何处理日期映射。
关于Spring-Data-DynamoDB:
DynamoDB将日期存储为字符串,因此如果您将日期属性作为日期模型的一部分,则可以将它们表示为数据模型中的字符串(我认为您当前正在执行),或者您可以将它们表示为日期,并配置Spring-Data-DynamoDB,以便将日期映射到字符串。这可以使用amazon-aws-sdk中的Custom Marshallers完成,并且已添加支持以在Spring Data DynamoDB模块中处理此问题。
您可以在此处阅读有关marshallers的内容:http://java.awsblog.com/post/Tx1K7U34AOZBLJ2/Using-Custom-Marshallers-to-Store-Complex-Objects-in-Amazon-DynamoDB
请注意,此编组与您可能需要Spring-Data-Rest从JSON执行到对象的任何映射是分开的 - 为此您仍需要@DateTimeFormat注释。
如果要在数据模型中将日期表示为java.util.Date,只需使用@DynamoDBMarshalling为域类中的属性添加getter,并传入要使用的marshaller类,例如:
@DynamoDBRangeKey(attributeName = "ReplyDateTime")
@DynamoDBMarshalling(marshallerClass=DefaultDynamoDBDateMarshaller.class)
public Date getReplyDateTime() {
...
DefaultDynamoDBDateMarshaller这里是Spring-Data-DynamoDB的支持类,但您可以实现自己的自定义日期/字符串映射。
有了这个,您现在可以更改存储库查找器方法,以便它们期望Date参数而不是字符串:
public Page<Reply> findByReplyDateTimeAfter(Date replyDateTime,Pageable pageable);
希望这有帮助,
干杯,
迈克尔