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

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

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

@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()方法将传入的日期字符串转换为时间。是否可以在不使用 Controller 的情况下实现此目的,并且我对从客户端发送不感兴趣,因为可能会出现时区问题。

我的转换器:

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&date=14-06-2014。我需要获取日期小于 14-06-2014 的所有名称,并保留 14-06-2014 或之后的数据。

在 POST 和 GET 时,我已经使用 JsonSerialize 和 JsonDeserialize 注释转换了传入和传出字符串,但如果我想使用 finder 方法获取任何数据,它不会像我想象的那样进行转换。

例如,如果我保存 {"name": "Test", "date": "08-10-2014"},在数据库中它将按其等效时间保存,如果我想使用 < 搜索它strong>08-10-2014 不是时间常数。我是 Spring 新手,找不到方法。提前致谢。

最佳答案

您使用 String 的原因是什么?首先作为日期的类型。这是相当次优的(礼貌地说)API 设计。

Spring Data REST 支持 @DateTimeFormat 的使用在查询方法参数上将 String您从 HTTP 请求获取的基本表示形式为 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 .

关于java - 如何在 Spring Data Rest 中格式化@param字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24096924/

相关文章:

java - Arraylist 问题 - 内存不足错误

java - 在java正则表达式中获取匹配的模式值

java - 如何在单个数组中返回重复三次的数组?

spring-boot - Spring Data Jpa中的唯一键约束

带有 Spring 数据的 Spring 批处理

java - 如何配置Spring Boot一对多实体关系

java - Maven 命令行选项有哪些?

java - 如何在 Spring Requestmapping 中将日期作为对象参数发布

java - 如何验证 hibernate.jdbc.batch_size 是否正常工作?

java - 将spring持久化存储库注入(inject)到服务层