我必须将传入的参数值转换为存储库接口所需的格式,是否可以这样做。我的域类,
@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()方法将传入日期字符串转换为时间。是否可以在不使用控制器的情况下实现这一点,并且我对从客户端发送不感兴趣,因为可能会出现时区问题。
我的转换器:
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());
}
}
在这里我必须使用,获取/测试/搜索/测试?名称=xx
虽然POST和GET,我已经转换传入和传出字符串使用JsonSerialize和JsonDeserialize注释,但如果我想使用finder方法获取任何数据,它不会像我想的那样转换。
例如,如果我保存{"name":"Test","date":"08-10-2014"},在DB中它将按其等效时间保存,如果我想使用08-10-2014搜索它,而不是时间常数。我是Spring新手,我找不到html" target="_blank">方法。提前谢谢。
如果我正确理解了您的问题,那么有两个方面值得关注——Spring Data Rest如何处理日期映射,以及Spring Data DynamoDB如何处理日期映射。
关于Spring-Data-DynamoDB:
DynamoDB将日期存储为字符串,因此,如果您在日期模型中有一个日期属性,那么您可以在数据模型中将其表示为字符串(我认为您目前正在这样做),或者可以将其表示为日期,并配置Spring数据DynamoDB,以便将日期映射为字符串。这可以使用amazon aws sdk中的自定义封送拆收器来完成,并在Spring Data DynamoDB模块中添加了支持来处理这一点。
您可以在此处阅读有关封送员的信息:http://java.awsblog.com/post/Tx1K7U34AOZBLJ2/Using-Custom-Marshallers-to-Store-Complex-Objects-in-Amazon-DynamoDB
请注意,此封送与可能需要Spring Data Rest从JSON到对象执行的任何映射是分开的-为此,您仍然需要@DateTimeFormat注释。
如果要将日期表示为java。util。在数据模型中,只需使用@DynamoDBMarshalling为域类中的属性注释getter,然后传入您希望使用的封送器类,例如:
@DynamoDBRangeKey(attributeName = "ReplyDateTime")
@DynamoDBMarshalling(marshallerClass=DefaultDynamoDBDateMarshaller.class)
public Date getReplyDateTime() {
...
这里的DefaultDynamoDBDateMarshaller是来自Spring数据DynamoDB的支持类,但您可以实现自己的自定义日期/字符串映射。
有了这个,您现在可以更改存储库查找器方法,以便它们期望Date参数而不是Strings:
public Page<Reply> findByReplyDateTimeAfter(Date replyDateTime,Pageable pageable);
希望这能有所帮助,
干杯,
迈克尔
您首先使用字符串作为日期类型的原因是什么。这是相当次优的(礼貌地说)API设计。
Spring Data REST支持在查询方法参数上使用DateTimeFormat,将从HTTP请求获得的字符串基本表示形式转换为日期。因此,您的存储库界面可能如下所示:
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);
}
这将导致字符串(如2014-06-08)转换为相应的日期。
问题内容: 我知道这是一个非常简单的问题,但我不知道该如何使用Google。 我能怎么做 那要用两次?我假设我必须“命名” the ,然后在参数中使用字典,但是我不确定正确的语法吗? 仅供参考,我知道我可以在参数中使用两次,但这不是重点:) 问题答案: 在Python 2.6+和Python 3中,您可以选择使用较新的字符串格式设置方法。 这样可以避免重复输入参数,或者 如果要命名参数。 这是严格
问题内容: 我正在学习将我的应用本地化为简体中文。我正在按照本教程进行操作。 因为本教程基于Obj-C,所以格式化后的字符串可以这样写: “你喜欢?” =“〜Es bueno?〜”; 但是我正在使用Swift。而且在Swift中,我认为您不能用来表示在那里放置了一些东西。我们有字符串插值对吗? 我的应用与数学有关。我想在表格视图单元格的详细标签中显示哪些输入用于计算结果。例如 此处的意思是“根据x
问题内容: 嗨,我有以下字符串:2012-05-20T09:00:00.000Z,我想将其格式化为20/05/2012,9am 如何在Java中这样做? 谢谢 问题答案: 用先 来,然后 到
问题内容: 我需要找出如何将数字格式化为字符串。我的代码在这里: 小时和分钟是整数,而秒是浮点数。str()函数会将所有这些数字转换为十分之几(0.1)。因此,而不是我的字符串输出“ 5:30:59.07 pm”,它将显示类似“ 5.0:30.0:59.1 pm”的内容。 最重要的是,我需要为我执行什么库/函数? 问题答案: 从Python 3.6开始,可以使用格式化的字符串文字或 f-strin
问题内容: 我从插件收到日期时间。我把它放到一个变量中: 实际上就是 。 我需要将其显示给用户作为交易时间,但是看起来不合适。 我想把它安排成 或* 。 * 我该如何改变字符串的顺序? 至于现在,我可能认为是使用 substr 分隔日期和时间。我仍然不确定如何添加其他字符并重新安排日期。 问题答案: 为什么 不像下面那样使用 date() ,请尝试 并将被输出
问题内容: 我想用JavaScript格式化价格。我想要一个以a 作为参数并返回如下格式的函数: 最好的方法是什么? 问题答案: 好的,根据您的发言,我正在使用此功能: 我乐于接受改进建议(我不愿意仅仅为了做到这一点就不包括YUI :))我已经知道我应该检测到“”。而不只是将其用作小数点分隔符…