JAX-RS and java.time.LocalDate as input parameter JAX-RS and java.time.LocalDate as input parameter json json

JAX-RS and java.time.LocalDate as input parameter


Normally I'd say to write a Serializer/Deserializer for Jackson, but since you don't want any other dependencies, you can use a JAXB solutions. Jackson (with Resteasy) comes with support for JAXB annotations. So what we can do is just write an XmlAdapter to convert from the String to the LocalDate. An example would be something like

import java.time.LocalDate;import java.time.format.DateTimeFormatter;import javax.xml.bind.annotation.adapters.XmlAdapter;public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {    @Override    public LocalDate unmarshal(String dateString) throws Exception {        return LocalDate.parse(dateString, DateTimeFormatter.ISO_DATE);    }    @Override    public String marshal(LocalDate localDate) throws Exception {        return DateTimeFormatter.ISO_DATE.format(localDate);    }}

You can choose any formatting you want, I just used the DateTimeFormatter.ISO_DATE, which will basically look for this format (2011-12-03).

Then all you need to do is annotate the field for getter of the type

public class Person {    private LocalDate birthDate;    @XmlJavaTypeAdapter(LocalDateAdapter.class)    public LocalDate getBirthDate() { return birthDate; }    public void setBirthDate(LocalDate birthDate) {         this.birthDate = birthDate;    }}

If you don't want to clutter your model classes with this annotation, then you can simply declare the annotation at the package level.

In a package-info.java file in the same package as the model class(es), add this

@XmlJavaTypeAdapters({    @XmlJavaTypeAdapter(type = LocalDate.class,                         value = LocalDateAdapter.class)})package thepackage.of.the.models;import java.time.LocalDate;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;

Test

@Path("/date")public class DateResource {    @POST    @Consumes(MediaType.APPLICATION_JSON)    public Response postPerson(Person person) {        return Response.ok(DateTimeFormatter.ISO_DATE.format(                           person.getBirthDate())).build();    }}@Testpublic void testResteasy() throws Exception {    WebTarget target = client.target(            TestPortProvider.generateURL(BASE_URI)).path("date");    String person = "{\"birthDate\":\"2015-01-04\"}";    Response response = target.request().post(Entity.json(person));    System.out.println(response.readEntity(String.class));    response.close();}

Result : 2015-01-04


UPDATE

Also for Jackson (I know the OP said without dependencies, but this is for others), you can use the jackson-datatype-jsr310 module. See full solution here