2011-04-25 16 views
7

Tengo problemas para correlacionar mi tipo de datos de Java con el tipo de datos de fecha de esquema estándar.Asignación del objeto de fecha de Java al formato de fecha y hora del esquema XML

Tengo una clase simple que anoté de esta manera. La variable de instancia de período es del tipo de objeto Fecha de Java.

@XmlAccessorType(value = XmlAccessType.NONE) 
public class Chart { 
    @XmlElement 
    private double amount; 
    @XmlElement 
    private double amountDue; 
    @XmlElement 
    private Date period; 
    //constructor getters and setters 
} 

Aquí está mi servicio web

@WebService 
public class ChartFacade { 
    @WebMethod 
    public Chart getChart() throws ParseException { 
     SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd"); 
     Chart chart = new Chart(20.0,20.5, df.parse("2001-01-01")); 
     return chart; 
    } 
} 

Mi problema es que devuelve los datos de la fecha en un formato no de acuerdo con lo que estoy esperando.

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <ns2:getChartResponse xmlns:ns2="http://ss.ugbu.oracle.com/"> 
     <return> 
      <amount>20.0</amount> 
      <amountDue>20.5</amountDue> 
      **<period>2001-01-01T00:01:00+08:00</period>** 
     </return> 
     </ns2:getChartResponse> 
    </S:Body> 
</S:Envelope> 

quería el elemento periodo que se devuelva como esto

<period>2001-01-01</period> 

¿Hay alguna manera de lograr esto?

Respuesta

8

puede hacer lo siguiente para controlar el tipo de esquema:

@XmlElement 
@XmlSchemaType(name="date") 
private Date period; 

Para más información:

+0

¿Cómo hacer que la fecha xml para formatear aaaa-MM-dd en este caso? –

+0

@road to yamburg - aaaa-MM-dd es el formato de xsd: date, que se especifica en la anotación @XmlSchemaType. –

+0

Es bueno saberlo, gracias, pero ¿puede indicarme la documentación que lo dice? Miré http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlSchemaType.html y no menciona ningún formato. –

0

El constructor Chart parece estar analizando la cadena de fecha formateada en un Date, que luego se serializa utilizando el formato predeterminado para la respuesta XML. supongo usando private String period; (y la fijación de los constructores) debería funcionar

+0

Gracias por su ayuda. Creo que su sugerencia funcionaría, pero los datos provenientes de DB son realmente un objeto Date y esta clase maneja el mapeo. Si convierto esto en una cadena, probablemente tendría que recompilar otro código. ¿Alguna otra idea, por favor? –

+0

respuesta @road to yamburgs es mucho mejor. votando – qwerty

7

Uso @XmlJavaTypeAdapter anotación y se puede reunir/unmarshal sus campos de la forma que desee.

No puedo decir si es la manera más simple.

Y tenga en cuenta también que puede dañar la interoperabilidad con cualquier código que intente usar su WSDL. Los programadores de ese otro código verían xsd: string como el tipo de campo, y por lo tanto tendrán que formatear y analizar sintácticamente de forma manual (como lo hace, sí), introduciendo quién sabe cuántos errores. Así que por favor considere si el xsd: date realmente una mala elección.

Robados de here:

@XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class) 
Date someDate; 
... 

public class DateAdapter extends XmlAdapter<String, Date> { 

    // the desired format 
    private String pattern = "MM/dd/yyyy"; 

    public String marshal(Date date) throws Exception { 
     return new SimpleDateFormat(pattern).format(date); 
    } 

    public Date unmarshal(String dateString) throws Exception { 
     return new SimpleDateFormat(pattern).parse(dateString); 
    } 
} 

ACTUALIZACIÓN: como fue mencionado por @Blaise Doughan, de una manera mucho más corto es de anotar la fecha con

@XmlSchemaType("date") 
Date someDate; 

A pesar de que todavía no está claro Por qué la información de la zona horaria no se genera para la fecha, este código funciona en la práctica y requiere mucho menos tipeo.

+0

Una posible solución.+1 –

+0

Para su información, el @XmlSchemaType ("fecha") de JAXB podría usarse para este caso de uso: http://stackoverflow.com/questions/5775860/mapping-java-date-object-to-xml-schema-datetime-format/5776970 # 5776970 –

Cuestiones relacionadas