当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Data Rest中格式化@参数字符串

马晓博
2023-03-14

我必须将传入的参数值转换为存储库接口所需的格式,是否可以这样做。我的域类,

@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">方法。提前谢谢。

共有2个答案

归誉
2023-03-14

如果我正确理解了您的问题,那么有两个方面值得关注——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);

希望这能有所帮助,

干杯,

迈克尔

白念
2023-03-14

您首先使用字符串作为日期类型的原因是什么。这是相当次优的(礼貌地说)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 :))我已经知道我应该检测到“”。而不只是将其用作小数点分隔符…