2017-04-25 127 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);