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