2014-09-10 10 views
5

Java 1.7 primavera 3.1.1 con la primavera-WS 2.1.1 Joda Hibernate 3.6 MySQL 5.0.57 Maven 3 Tomcat 7 Eclipse 3.7utilizzando le associazioni JAXB personalizzato per ottenere xs: datetime in tanto Joda ma ottenere XMLGregorianCalender

Il servizio Web è stato distribuito e il client Web è stato distribuito e il servizio Web e il client Web parlano tra loro.

Ma proprio come in un videogioco d'epoca, l'uccisione di un gruppo di draghi genera appena un altro gruppo di draghi .

Ora è tutto Joda Datetime xs: dateTime jaxb binding thingy che mi sputa fuoco.

Googling presenta molte soluzioni che ho cercato di seguire.

un'entità rappresentante

@Entity 
@Table(name="form_templates", catalog="mycomp") 
@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class FormTemplate implements java.io.Serializable 
{ 
    private static final long serialVersionUID = 8533964268513480152L; 
    .... 

    @Column(name="revision_datetime") 
    @Type(type="org.joda.time.contrib.hibernate.PersistentDateTime") 
    @XmlElement(name="revisionTimestamp") 
    @XmlJavaTypeAdapter(JodaDateTimeAdapter.class) 
    @XmlSchemaType(name="dateTime") 
    DateTime revisionTimestamp; 
    .... 
} 

JodaDateTimeAdapter

@XmlTransient 
public class JodaDateTimeAdapter extends XmlAdapter<String, DateTime> 
{ 
    private static final DateTimeFormatter XML_DATE_FORMAT =  ISODateTimeFormat.dateTimeNoMillis(); 
    private static final DateTimeFormatter XML_DATE_TIME_FORMAT = ISODateTimeFormat.localDateOptionalTimeParser(); 
    private static final DateTimeFormatter DATE_PATTERN =   DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); 

    public DateTime unmarshal(String dateStr) throws Exception 
    { //parsing from schema to java class 
     DateTime result = DATE_PATTERN.parseDateTime(dateStr); 
     return result; 
    } 

    public String marshal(DateTime dateTime) throws Exception 
    { //printing from java class to schema 
     String result = DATE_PATTERN.print(dateTime); 
     return result; 
    } 
} 

parte relavent di pom

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-java2ws-plugin</artifactId> 
    <version>${cxfVersion}</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-rt-frontend-jaxws</artifactId> 
      <version>${cxfVersion}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-rt-frontend-simple</artifactId> 
      <version>${cxfVersion}</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
      <id>process-classes</id> 
      <phase>process-classes</phase> 
      <configuration> 
       <outputFile>src/main/webapp/WEB-INF/wsdl/FormsService.wsdl</outputFile> 
       <className>com.mycomp.forms.web.endpoint.FormsEndpoint</className> 
       <genWsdl>true</genWsdl> 
       <verbose>true</verbose> 
      </configuration> 
      <goals> 
       <goal>java2ws</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Così il servizio web compila e distribuisce con successo. Guardo nella wsdl e vedo

... 
<xs:complexType name="formTemplate"> 
    <xs:sequence> 
     ... 
     <xs:element minOccurs="0" name="revisionTimestamp" type="xs:dateTime"/> 
     ... 

quindi sembra che sia diretto nella giusta direzione. Con il servizio Web distribuito mi rivolgo la mia attenzione al client Web

ho compilare il client web con questo pom relavent snippet

... 
    <plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxfVersion}</version> 
    <executions> 
     <execution> 
     <id>generate-sources</id> 
     <phase>generate-sources</phase> 
     <configuration> 
      <sourceRoot>${project.build.directory}/generated_sources</sourceRoot> 
      <wsdlOptions> 
      <wsdlOption> 
       <wsdl>http://localhost:8080/dept_forms_webservice/formsService?wsdl</wsdl> 
       <bindingFiles> 
       <bindingFile>${basedir}/src/main/resources/jaxb-custom-bindings.xml</bindingFile> 
       </bindingFiles> 
      </wsdlOption> 
      </wsdlOptions> 
     </configuration> 
     <goals> 
      <goal>wsdl2java</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin>  
    ... 

e JAXB-custom-bindings.xml trovano in/src/java/risorse

<?xml version="1.0" encoding="UTF-8"?> 
<jaxws:bindings wsdlLocation="http://localhost:8080/dept_forms_webservice/formsService?wsdl" 
      xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxws:bindings> 
    <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <jxb:javaType name="org.joda.time.DateTime" xmlType="xs:dateTime" 
         parseMethod="com.mycomp.forms.util.JodaDateTimeAdapter.unmarshall" 
         printMethod="com.mycomp.forms.util.JodaDateTimeAdapter.marshall"/> 
    </jxb:globalBindings> 
    </jaxws:bindings> 
</jaxws:bindings> 

e tutto viene compilato, le fonti vengono generati, client web distribuisce con successo

MA

guardando nell'entità Modellomaschera generato vedo

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlSchemaType; 
import javax.xml.bind.annotation.XmlType; 
import javax.xml.datatype.XMLGregorianCalendar; // <---- should be joda datetime here 

public class FormTemplate 
{ 
    ... 
    @XmlSchemaType(name = "dateTime") 
    protected XMLGregorianCalendar revisionTimestamp; // <-- should be joda datetime here 
... 

così ho chiaramente perso qualche pezzo microscopico delle minuzie configurazione e sarebbe stato mai così grato se qualcuno ricorda ciò che è sbagliato e come a destra esso.

TIA,

Ancora-learning Steve

+0

hai risolto questo problema? se sì, come lo hai risolto? – Xstian

risposta

4

Ho usato questa configurazione e funziona bene.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<jaxb:bindings 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:annox="http://annox.dev.java.net" 
    xmlns:tns="http://esb.tsf.ab.com/enterprise/message" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" 
    jaxb:extensionBindingPrefixes="xjc annox" 
    version="2.1"> 

    <jaxb:globalBindings> 
     <xjc:serializable uid="12343" /> 
     <jaxb:javaType name="java.util.Date" xmlType="xs:date" printMethod="adapter.DateAdapter.printDate" parseMethod="adapter.DateAdapter.parseDate" /> 
     <jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" printMethod="adapter.DateTimeAdapter.printDateTime" parseMethod="adapter.DateTimeAdapter.parseDateTime" /> 
     <jaxb:javaType name="java.util.Date" xmlType="xs:time" printMethod="adapter.TimeAdapter.printTime" parseMethod="adapter.TimeAdapter.parseTime" /> 
    </jaxb:globalBindings> 

</jaxb:bindings> 

Io uso questo plugin per generare fagioli

<plugin> 
       <groupId>org.jvnet.jaxb2.maven2</groupId> 
       <artifactId>maven-jaxb2-plugin</artifactId> 
       <version>0.8.1</version> 
       <executions> 
        <execution> 
         <phase>generate-sources</phase> 
         <goals> 
          <goal>generate</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <args> 
         <arg>-Xannotate</arg> 
         <arg>-nv</arg> 
         <arg>-Xnamespace-prefix</arg> 
        </args> 
        <extension>true</extension> 
        <schemaDirectory>src/main/resources/schema/xsd</schemaDirectory> 
        <schemaIncludes> 
         <schemaInclude>my.xsd</schemaInclude> 
        </schemaIncludes> 
        <bindingDirectory>src/main/resources/schema/xjb</bindingDirectory> 
        <bindingIncludes> 
         <include>*.xjb</include> 
        </bindingIncludes> 
        <debug>true</debug> 
        <verbose>true</verbose> 
        <episode>true</episode> 
        <forceRegenerate>true</forceRegenerate> 
        <plugins> 
         <plugin> 
          <groupId>org.jvnet.jaxb2_commons</groupId> 
          <artifactId>jaxb2-basics</artifactId> 
          <version>0.6.0</version> 
         </plugin> 
         <plugin> 
          <groupId>org.jvnet.jaxb2_commons</groupId> 
          <artifactId>jaxb2-basics-annotate</artifactId> 
          <version>0.6.0</version> 
         </plugin> 
         <plugin> 
          <groupId>org.jvnet.jaxb2_commons</groupId> 
          <artifactId>jaxb2-namespace-prefix</artifactId> 
          <version>1.1</version> 
         </plugin> 
        </plugins> 
       </configuration> 
      </plugin> 

e utilizzare questa args per WSDL2Java

<wsdlOption> 
            <wsdl>${basedir}/src/main/resources/schema/integration/wsdl/CostPriceMaintenance.wsdl</wsdl> 
            <extraargs> 

             <extraarg>-nexclude</extraarg> 
             <extraarg>http://namespace</extraarg> 

            </extraargs> 
           </wsdlOption> 

tenta di utilizzare questa configurazione, si dispone di un supplementare.

<?xml version="1.0" encoding="UTF-8"?> 
<jxb:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb"> 

    <jxb:globalBindings> 
     <jxb:javaType name="org.joda.time.DateTime" xmlType="xs:dateTime" 
         parseMethod="com.mycomp.forms.util.JodaDateTimeAdapter.unmarshall" 
         printMethod="com.mycomp.forms.util.JodaDateTimeAdapter.marshall"/> 
    </jxb:globalBindings> 

</jxb:bindings> 
Problemi correlati