2017-04-25 32 views
1

我试图用RestEasy的客户端调用一个REST服务客户RestEasy的与LocalDateTime

在我的服务我springboot创建并返回一个LocalDateTime PROPERT

如果我用这个depencency

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-jsr310</artifactId> 
    <version>2.8.8</version> 
</dependency> 

这是我在我的豆中的代码:

private LocalDateTime dtPublicacao; 

这是当我打电话给我的服务:

dtPublicacao: "2017-04-20T00:00:00"

如果我删除这样的结果:

dtPublicacao: { 
    hour: 0, 
    minute: 0, 
    second: 0, 
    nano: 0, 
    dayOfYear: 110, 
    dayOfWeek: "THURSDAY", 
    month: "APRIL", 
    dayOfMonth: 20, 
    year: 2017, 
    monthValue: 4, 
    chronology: { 
    id: "ISO", 
    calendarType: "iso8601" 
    } 
} 

所以在我的客户我创建相同的模型,并用它来执行获取

Client client = ClientBuilder.newClient(); 
     WebTarget target = client.target("http://localhost:8585").path("/edital/"); 
     try{ 
      List<EditalVO> response = target.request().get(new GenericType<List<EditalVO>>(){}); 
      return response; 
     }catch (NotFoundException e) {   
      throw new NotFoundException(); 
     }  

所以,如果我把我的客户LocalDateTime我得到这个错误:

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class java.time.LocalDateTime] from JSON String; no single-String constructor/factory method (through reference chain: br.com.lumera.protesto.edital.vo.EditalVO["dtExpiracao"])

解决我需要在我的客户端形式LocalDateTime更改为日期,并添加

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
private Date dtPublicacao; 

我已经尝试添加在我的客户端相同的依赖,但他注册LocalDateTimeSerializer.class但是当我叫他REST点没有通过序列化方法,我又得到了错误。

我可以从Restasey客户端接收并发送LocalDateTime吗?

TKS

UPDATE 我已经尽力做到这一点太:

ObjectMapper obj = new ObjectMapper(); 
obj.registerModule(new JavaTimeModule()) 

没有成功,后来我尝试在我的客户:

client.register(obj); 

与没有成功..如果我调试我的应用程序,他输入方法

public LocalDateTimeSerializer(DateTimeFormatter f) { 
    super(LocalDateTime.class, f); 
} 

private LocalDateTimeSerializer(LocalDateTimeSerializer base, Boolean useTimestamp, DateTimeFormatter f) { 
    super(base, useTimestamp, f); 
} 
在LocalDateTimeSerializer

但不`吨的序列化方法进入或反序列化

+0

的[javadoc的(https://docs.jboss.org/resteasy /docs/3.0.9.Final/javadocs/javax/ws/rs/core/Configurable.html#register(java.lang.Object))说:注册扩展提供程序或功能元提供程序实例可用于这个范围的范围。 –

回答

1

不能完全确定,但好像你需要有这样dependency

,并通过

objectMapper.registerModule(new JavaTimeModule()); 
注册模块
+0

是的,你是对的。该测试一直声称您必须注册[JavaTimeModule](https://github.com/FasterXML/jackson-datatype-jsr310/blob/master/src/test/java/com/fasterxml/jackson/datatype/jsr310/ ModuleTestBase.java#L14)之前[反序列化](https://github.com/FasterXML/jackson-datatype-jsr310/blob/master/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java #L18)。 –

+0

@ holi-java你花时间看看实际的测试,不错! – Eugene

+0

当我不确定如何使用库时,我相信一线程序员,如果意图清晰,只需几分钟就不会花太多时间。 –

0

如何将ObjectMapper配置成resteasy-client模块?你可以看到这个question


我已经写了两个测试如何在一侧适合github的另一面。

适合客户端服务器端

如果你想在客户端,以适应服务器端必须在模式日期格式设置为"yyyy-MM-dd'T'HH:mm:ss",例如:

ObjectMapper#setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")) 

OR可以使用@JsonFormat为:

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") 
private Date dtPublicacao; 

配合服务器端客户机端

如果你想在服务器端,以适应您必须格局DateTimeFormatter设置为"yyyy-MM-dd HH:mm:ss"客户端,例如:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 
Module module = new JavaTimeModule().addDeserializer(LocalDateTime.class 
             ,new LocalDateTimeDeserializer(formatter)); 

ObjectMapper#registerModule(module);