serverfaces
serverfaces

Reputation: 1175

Jackson and empty string

I have the following code:

import javax.xml.datatype.XMLGregorianCalendar;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;

    public class Test {

        public static void main(String[] args) {
            print("");//Prints null
            print("2013-06-14T01:23:47.547+0000"); //Prints the date
            print("&&&&AD");//Throws error
        }

        private static void print(String dateString) {
            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false );
            try {
                String x = "{\"dateTime\": \""+dateString+"\"}";
                Foo type = mapper.readValue(x, Foo.class);
                System.out.println("Datetime is " + type.getDateTime());
            } catch (Exception e) {
                e.printStackTrace();
            } 
        }

        private static class Foo {

            private XMLGregorianCalendar dateTime;
            public XMLGregorianCalendar getDateTime() {
                return dateTime;
            }
            public void setDateTime(XMLGregorianCalendar dateTime) {
                this.dateTime = dateTime;
            }

        }

    }

When the String value is blank "", then Jackson treats the value as null, but when I put some invalid value such as "&&&&AD", it tries to convert it to XML date Time and throws error.

The error I get is:

com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of javax.xml.datatype.XMLGregorianCalendar from String value '&&&&AD': not a valid representation (error: Failed to parse Date value '&&&&AD': Can not parse date "&&&&AD": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))

I would like to see the same behavior for blank value. How do I do it?

Is there a way to configure Jackson to fail for blank value?

Upvotes: 1

Views: 3140

Answers (1)

Michał Ziober
Michał Ziober

Reputation: 38655

You have to implement new deserializer for XMLGregorianCalendar type. It would look like this:

class XMLGregorianCalendarDeserializer extends GregorianCalendarDeserializer {

    private static final long serialVersionUID = 1L;

    @Override
    public XMLGregorianCalendar deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException {
        try {
            return super.deserialize(jp, ctxt);
        } catch (JsonProcessingException e) {
            return null;
        }
    }
}

After that you have to define deserializer in POJO class:

class Foo {

    @JsonDeserialize(using = XMLGregorianCalendarDeserializer.class)
    private XMLGregorianCalendar dateTime;

    ...
}

Upvotes: 2

Related Questions