I believe that it is JAXB that defaults to a Gregorian calendar.
In any case, I think the best way to get full control of this is to create an 
XMLAdapter and annotate your field like this:

    /**
     * @return the allergyStartDate
     */
    @XmlJavaTypeAdapter(com.akimeka.ws.common.DateAdapter.class)

So, here is an example of an XmlAdapter that accepts dates in a variety of 
acceptable formats.   It uses org.apache.commons.lang.time.DateUtils.
As seen in the marshal method, it emits dates using the 
DEFAULT_DATEFORMAT_STRING format.

You can change this up as needed.  You just need to implement the marshal and 
unmarshal methods.
Hope this helps.

-- Andy

/**********************************************************************/
public class DateAdapter extends XmlAdapter<String, Date>
{

    private static final Logger log = Logger.getLogger(DateAdapter.class);
    final static protected String DEFAULT_DATEFORMAT_STRING = "MM-dd-yyyy";
    final static protected String[] ACCEPTABLE_INPUT_FORMATS = 
{DEFAULT_DATEFORMAT_STRING, "yyyy-MM-dd", "MM/dd/yyyy", "yyyy-MM-dd HH:mm", 
"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd'T'HH:mm:ss"};

    @Override
    public Date unmarshal(String v) throws Exception
    {

        if (log.isDebugEnabled())
            log.debug("com.akimeka.ws.common.DateAdapter unmarshalling [" + v + 
"]");
        Date returnDate = DateUtils.parseDateStrictly(v, 
ACCEPTABLE_INPUT_FORMATS);
        if (log.isDebugEnabled())
                log.debug("com.akimeka.ws.common.DateAdapter parsed date: " + 
returnDate);
        return returnDate;
    }

    @Override
    public String marshal(Date v) throws Exception
    {
        if (log.isDebugEnabled())
            log.debug("com.akimeka.ws.common.DateAdapter marshalling [" + v + 
"]");
        if (v == null) return "";
        DateFormat outputFormat = new 
SimpleDateFormat(DEFAULT_DATEFORMAT_STRING);
        return outputFormat.format(v);
    }

}
/**********************************************************************/

-----Original Message-----
From: Perelum [mailto:[email protected]]
Sent: Sunday, April 27, 2014 10:36 AM
To: [email protected]
Subject: Julian to Gregorian calendar Switch. CXF behavior managing dates 
before 15/10/1582

I'm building a web service in java, deploying it under Jboss-as-7.1.1.Final, 
based on org.apache.cxf 2.4.6.

I need to expose a web method that takes in input a date field that can reach 
many centuries in the past. At the moment I'm using java.util.Date in my 
request bean. So, my web method is

/public UpdatePersonResponse updatePerson(UpdatePersonRequest request) { ...
}/

The request bean UpdatePersonRequest has the date field, with getter and
setter:

/...
private Date birthday;
.../

In the soap request that I'm testing I put:

/
<birthday>1452-04-15</birthday>/

The apache cxf logs show:

/16:07:36,568 INFO  [org.apache.cxf.interceptor.LoggingInInterceptor] ...
Inbound Message
[...]
<birthday>1452-04-15</birthday>/

(this is correct)

A custom log I added into the set method of the request bean shows:
/
16:07:36,843 DEBUG  com.xxx.xxx.service.request.UpdatePersonRequest ...
called setBirthday with argument [06/04/52 0.00]/

(this is wrong)

Then the request bean is valorized as follows:

/UpdatePersonRequest [... birthday=Thu Apr 06 00:00:00 CET 1452, ...]/

(this is wrong)

So I obtain 1452 April 06, and not 1452 April 15.

I tried with different dates, for example, soap:

/<birthday>1452-04-30</birthday>/

custom log:

/21:11:51,607 DEBUG  [com.xxx.xxx.service.request.UpdatePersonRequest]  ...
called setBirthday with argument [21/04/52 0.00]/

(wrong)

The bean is valorized with:

/UpdatePersonRequest [... birthday=Fri Apr 21 00:00:00 CET 1452 ...]/

(again wrong)

*I obtain April 21 and not April 30*, with *9 days of difference*.

I tried with several dates and noticed that this behavior occurs for dates 
prior then *15/10/1582*, that is the historical start date for the Gregorian 
Calendar.
>From 15/10/1582 onward the request bean is valorized with the exact date I 
>enter in the soap request.

So, I don't understand what is the logic used by Apache Cxf. Does it assume 
that the incoming request contains a date expressed in Gregorian calendar and 
then convert it into Julian date for dates prior that 15/10/1582? If it is so, 
why does such a conversion is performed?

Thank you very much.







--
View this message in context: 
http://cxf.547215.n5.nabble.com/Julian-to-Gregorian-calendar-Switch-CXF-behavior-managing-dates-before-15-10-1582-tp5743333.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to