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

时间:2014-06-07 11:59:38

标签: java spring spring-data spring-data-rest

我必须将传入的参数值转换为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 而不是时间常数进行搜索。我是泉水的新手,我无法找到适合它的方法。提前谢谢。

2 个答案:

答案 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);

希望这有帮助,

干杯,

迈克尔