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

使用Spring@RestController和@QuerydsLPredicate处理带有ZonedDateTime参数的GET

解修然
2023-03-14
@RequestMapping(value = "/invoices", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<List<Invoice>> getAllInvoices(@QuerydslPredicate(root = Invoice.class) Predicate predicate, Pageable pageable) throws URISyntaxException {
    log.debug("REST request to get a page of Invoices");
    Page<Invoice> page = invoiceService.findAll(predicate, pageable);
    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/invoices");
    return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}

当我尝试使用以下URL调用endpoint时:http://localhost:3000/api/invotions?page=0&size=20&sort=id,asc&sort=id&transactiondate=2016-05-09T22:00:00.000z&transactiondate=2016-05-17T21:59:59.999z

将引发此异常:

java.time.format.DateTimeParseException: Text '2016-05-09T22:00:00.000Z' could not be parsed at index 10
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) ~[na:1.8.0_91]
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) ~[na:1.8.0_91]
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597) ~[na:1.8.0_91]
    at org.springframework.format.datetime.standard.TemporalAccessorParser.parse(TemporalAccessorParser.java:80) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.format.datetime.standard.TemporalAccessorParser.parse(TemporalAccessorParser.java:47) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.format.support.FormattingConversionService$ParserConverter.convert(FormattingConversionService.java:194) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35) ~[spring-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:192) ~[spring-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.convertToPropertyPathSpecificType(QuerydslPredicateBuilder.java:217) ~[spring-data-commons-1.11.2.RELEASE.jar:na]
..... etc etc

只使用ZonedDateTime对象解析给定的日期是可行的(在Ideone.com上),但是其他的可能是错误的。我在SO上发现了这个问题:使用Spring@RestController处理带有ZonedDateTime参数的HTTP GET

@RequestMapping(value = "/invoices", params="action", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<List<Invoice>> findInvoices(@RequestParam("dt") @DateTimeFormat(iso=ISO.DATE_TIME) ZonedDateTime dt,Pageable pageable) throws URISyntaxException {
    log.debug("REST request to get a page of Invoices");
    Page<Invoice> result = invoiceRepository.findAllByTransactionDate(dt,pageable);
    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(result, "/api/invoices");
    return new ResponseEntity<>(result.getContent(), headers, HttpStatus.OK);
}

明显的区别是在RequestParam中添加了@datetimeformat(iso=iso.date_time)。现在我在想;我如何让它与QueryDSLPredicateBuilder一起工作呢?我应该以某种方式键入格式吗?

共有1个答案

房学文
2023-03-14

在寻找使用querydsl参数绑定的不同方面(使用>x>类比较)时,我遇到了以下帖子:Spring Data REST的querydsl集成是否可以用于执行更复杂的查询?

其中一个答复暗示如下:

确保您将@DateTimeFormat注释添加到User的dateOfBirth-property中,以便Spring能够将传入的字符串正确地转换为LocalDate实例。

@DateTimeFormat(iso = ISO.DATE_TIME) 
@Column(name = "transaction_date")
private ZonedDateTime transactionDate;
 类似资料:
  • 我有一个带有两个数据库的Spring Batch应用程序:一个SQLDB用于Spring Batch元数据,另一个是存储所有业务数据的MongoDB。关系DB仍然使用。但是我不认为Mongo写入是在带有回滚的活动事务中完成的。以下是上官方Spring Batch留档的摘录: ItemWriter实现,使用Spring数据的MongoOperations实现写入MongoDB存储。由于MongoDB

  • 问题内容: 当我编写一个解析命令行参数的Spring命令行应用程序时,如何将它们传递给Spring?我是否希望结构化main()以便它首先解析命令行args,然后解析其Spring?即使这样,它将如何将持有解析的args的对象传递给Spring? 问题答案: 我可以想到两种可能性。 1)设置静态参考。(尽管通常不赞成使用静态变量,但在这种情况下可以,因为只能有1个命令行调用)。 然后,您可以通过以

  • 批处理配置具有spring作业,只有一个步骤 1)读取器-从csv文件读取。处理器对文件应用一些规则。Drools请运行schema-postgresql.sql来设置数据库 WRITER使用SPRING DATA JPA写入DB Writer将此称为PersonDaoImpl:

  • 我想制作一个,传递事件和一些参数。问题是函数没有得到元素。下面是一个例子: 必须在匿名函数之外定义。如何获取传递的元素以在匿名函数中使用?有办法做到这一点吗? 那么呢?我似乎根本无法通过传递事件,是吗? 使现代化 我似乎用“这个”解决了这个问题 其中包含我可以在函数中访问的。 addEventListener 但是我想知道:

  • Spring Boot1.3.2.释放 QueryDSL 3.7.2 因此,我的实体是这样设置的: person.java Pet.java http://localhost:8080/test-app/list?name=bob 我的预期是,通过使用,将构建以下谓词: 在Spring的QuerydslPredicate支持下,这是可能的吗?还是应该从查询参数手动构建谓词? 如果这些都不可能,那么

  • 我正在尝试创建一个Spring批处理应用程序。我们使用SQL Anywhere数据库,它实际上是,一种已知的数据库类型。为了简化操作,我在主类上使用了,在配置类上使用了。 问题是,我的数据库驱动程序返回一个产品名“SQL Anywhere”,而Spring无法识别这个名称,从而导致各种错误。通过在配置类中显式创建JobRepositoryFactoryBean,我能够克服其中的一些问题: 但是,在