2017-07-11 8 views
0

MOXyでJSONを非マーシャル化してLocalDateLocalDateTimeにするにはどうすればよいですか?MOXyでLocalDate/LocalDateTimeをアンマーシャリングする

私はタイプそれぞれLocalDateLocalDateTimeDate、の3つの分野でのサンプルインスタンスを生成@GET方法を持っています。

そのエンドポイントを打つ、私が取得:

{ 
    "date": "2017-07-11T10:11:10.817+02:00" 
} 

あなたが見ることができるように、両方のlocalDate

{ 
    "localDate": "2017-07-11", 
    "localDateTime": "2017-07-11T10:11:10.817", 
    "date": "2017-07-11T10:11:10.817+02:00" 
} 

は、私はその後、もう一度データを返す私の@POST方法に上記のデータをPOSTおよびlocalDateTimeは、MOXyがこれらの2つのフィールドを初期化しないため、プロセスで失われます。

何がありますか? MOXyはこれらの型のシリアル化をサポートしているようですが、逆シリアル化はサポートされていませんか?

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import java.time.LocalDate; 
import java.time.LocalDateTime; 
import java.util.Date; 

@Path("/test/date") 
public class DateTest { 
    public static class Data { 
     public LocalDate localDate; 
     public LocalDateTime localDateTime; 
     public Date date; 
    } 

    @GET 
    @Path("roundtrip") 
    public Response roundtrip() { 
     Data sample = getSample(); 
     return roundtrip(sample); 
    } 

    @POST 
    @Path("roundtrip") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response roundtrip(Data t) { 
     return Response.status(Response.Status.OK).entity(t).build(); 
    } 

    protected Data getSample() { 
     final Data data = new Data(); 
     data.localDate = LocalDate.now(); 
     data.localDateTime = LocalDateTime.now(); 
     data.date = new Date(); 
     return data; 
    } 
} 

MOXYバージョン:jersey-media-moxy-2.25.1

+1

これは実際には(より一般的な意味で)「シリアライズ」しているのですか、それとも単純にtoString()を呼び出していますか?違いがあります。 MOXy/JAXBが実際にJava8の時間をサポートするまで、おそらく[XMLAdapterを使う]必要があります(http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html )。または、MOXyの代わりにJacksonを使用して[Java 8の時間サポートを使用する](https://stackoverflow.com/a/28803634/2587435) –

+0

@peeskillet私はこの可能性については考えていませんでした。私はあなたの記事(https://stackoverflow.com/a/26825079/383124)を読んで、それがサポートされていたということを理解しました。 – phant0m

+0

その投稿では、前回のコメントで解決策として挙げたものの両方の例を実際に提示しました(つまり、アダプターやジャクソンへの切り替えを使用します)。 –

答えて

1

は、私は、次のアダプタクラスを実装peeskilletの提案によると:

public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime>{ 

    private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 

    @Override 
    public String marshal(LocalDateTime localDateTime) throws Exception { 
    return localDateTime.format(DTF); 
    } 

    @Override 
    public LocalDateTime unmarshal(String string) throws Exception { 
    return LocalDateTime.parse(string, DTF); 
    } 

} 

また、私はMOXYための私のクラスと同じパッケージにpackage-info.javaを作成し、アダプタ(サブパッケージ内)は、次の内容で配置されています。

@XmlJavaTypeAdapters({ 
    @XmlJavaTypeAdapter(type=LocalDateTime.class, 
     value=LocalDateTimeAdapter.class) 
}) 
package api; 

import java.time.LocalDateTime; 

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters; 

import api.adapter.LocalDateTimeAdapter; 

したがって、マーシャリングとアンマーシャリングは問題なく動作します。 DTFでは、適用されるフォーマットを指定することができます。

関連する問題