java - 带有 Date 类型的 spring-cloud-feign Client 和 @RequestParam

标签 java spring rest jackson netflix-feign

这次我使用声明式 REST 客户端,在一些 Spring Boot 应用程序中进行假装。

我想要实现的是调用我的 REST API 之一,如下所示:

@RequestMapping(value = "/customerslastvisit", method = RequestMethod.GET)
    public ResponseEntity customersLastVisit(
            @RequestParam(value = "from", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date from,
            @RequestParam(value = "to", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date to) {

如您所见,API 接受格式为 (yyyy-MM-dd)

的起始日期和终止日期参数的调用

为了调用该 API,我准备了以下一段 @FeignClient:

@FeignClient("MIIA-A")
public interface InboundACustomersClient {
    @RequestMapping(method = RequestMethod.GET, value = "/customerslastvisit")
    ResponseEntity customersLastVisit(
            @RequestParam(value = "from", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date from,
            @RequestParam(value = "to", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date to);
}

一般来说,几乎是复制粘贴。现在在我的启动应用程序的某个地方,我使用它:

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
ResponseEntity response = inboundACustomersClient.customersLastVisit(formatter.parse(formatter.format(from)),
        formatter.parse(formatter.format(to)));

然后,我得到的是

nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.util.Date] for value 'Sun May 03 00:00:00 CEST 2015';

nested exception is java.lang.IllegalArgumentException: Unable to parse 'Sun May 03 00:00:00 CEST 2015'

所以,问题是,我对请求做错了什么,它在发送到我的 API 之前没有解析为“仅限日期”格式?或者这可能是一个纯粹的 Feign 库问题?

最佳答案

您应该创建并注册一个假格式化程序来自定义日期格式

@Component
public class DateFormatter implements Formatter<Date> {

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

    @Override
    public Date parse(String text, Locale locale) throws ParseException {
        return formatter.parse(text);
    }

    @Override
    public String print(Date date, Locale locale) {
        return formatter.format(date);
    }
}


@Configuration
public class FeignFormatterRegister implements FeignFormatterRegistrar {

    @Override
    public void registerFormatters(FormatterRegistry registry) {
        registry.addFormatter(new DateFormatter());
    }
}

关于java - 带有 Date 类型的 spring-cloud-feign Client 和 @RequestParam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35158065/

相关文章:

java - @Transactional 在 REST 层还是在服务层?哪个更好?

javascript - AngularJS:用户可以注册两次,如何防止这种情况?

java - 如何构建标准化的 RESTful Java API

java - 如何添加多个查询参数不同的 RestController 端点?

java - Spring MVC 文件上传 - 验证

java - 如何在 Java 中使用 Comparables 创建自定义参数化列表对象?

java - 为什么我的掷骰子程序卡住了?

Spring + JPA + Postgresql 配置

java - 带有 javax.xml.soap 的 SOAP 消息 - 命名空间错误?

java - java-10 中的 XXXSummaryStatistics 新构造函数