0

首先是一些背景信息,如果格式不正确,请原谅我。

我有两个对象试图通过 XML 来回映射。一个是通过 wsimport 自动生成的,因此我无法使用 JAXB 或 XStream 注释。另一个是由我们正在实施的工具自动生成的。

我正试图将两个对象相互映射,除了日期字段是Java.util.Date,另一个是XMLGregorian Calendar。

我认为最快的方法是使用 XStream 来获取 XML 字符串,而不是大量的手动映射过程,交换根元素并序列化到另一个对象。那时我遇到了转换日期的问题。我曾尝试使用转换器,但我又遇到了另一个转换问题。我希望有人能帮助我解决这个问题。

我有两个测试实体:

import java.util.Date;

    import javax.xml.datatype.XMLGregorianCalendar;
    import com.eccles.utilities.*;

    public class SampleEntityGregorian {

        private XMLGregorianCalendar date = DateUtils.xmlGregCalFromDate(new Date());

        public XMLGregorianCalendar getGregCal() {
            return date;
        }

        public void setGregCal(XMLGregorianCalendar gregCal) {
            this.date = gregCal;
        }

    }

import java.util.Date;

    public class SampleEntityJavaUtil {

        private Date date = new Date();

        public Date getUtilDate() {
            return date;
        }

        public void setUtilDate(Date utilDate) {
            this.date = utilDate;
        }

    }

我有一个自定义转换器,我正在向 Xstream 注册,以从两者之间的 jav.util.date 和 XMLGregorianCalendar 编组/解组。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class FromJavaUtilDateConverter implements Converter {

    public FromJavaUtilDateConverter() {
    }

    public boolean canConvert(Class clazz) {

        System.out.println("****CAN CONVERT " + clazz.getName() + "?***");
        System.out.println("Class name = " + clazz.getName());
        System.out.println(java.util.Date.class.isAssignableFrom(clazz));
        System.out.println("\n");

        return java.util.Date.class.isAssignableFrom(clazz);

    }

    public void marshal(Object value, HierarchicalStreamWriter writer,
                    MarshallingContext context) {
        System.out.println("***MARSHALLING*** \n");

        Date date = (Date) value;

        writer.setValue(date.toString());

    }

    public Object unmarshal(HierarchicalStreamReader reader,
                    UnmarshallingContext context){
        System.out.println("**UNMARSHALLING**");

        XMLGregorianCalendar result = null;

        try {

        String readerString = reader.getValue();
        System.out.println("Reader value = " + readerString + "\n");    

        GregorianCalendar gregorianCalendar;

        SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");

        Date date = sdf.parse(readerString);
        System.out.println("parsed string to date = " + date.toString());

        gregorianCalendar = (GregorianCalendar)GregorianCalendar.getInstance();

        gregorianCalendar.setTime(date);
        System.out.println("Gregorian Calendar from Date = " + gregorianCalendar.getTime() + "\n");

        result = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
        System.out.println("XML Gregorian Calendar = " + result.toXMLFormat() + "\n");

        //System.out.println(result.t);

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        catch (DatatypeConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;      
    }

}

这是我的测试:

@Test
public void testSerializationToGregCalendar(){      

    SampleEntityJavaUtil entityJavaUtil = new SampleEntityJavaUtil();

    XStream xs = new XStream();
    xs.registerConverter(new FromJavaUtilDateConverter());
    xs.alias("SampleEntityGregorian.class",SampleEntityJavaUtil.class);

    String entityJavaUtilString = xs.toXML(entityJavaUtil);
    System.out.println("Entity with Java Util Date:" + "\n");
    System.out.println(entityJavaUtilString);
    System.out.println("\n");

    SampleEntityGregorian entityGregCal = new SampleEntityGregorian();

    System.out.println(xs.toXML(entityGregCal));

    try{
        entityGregCal = (SampleEntityGregorian) xs.fromXML(entityJavaUtilString);
    }
    catch(Exception e){
        System.out.println("Failed to Serialize");
        e.printStackTrace();
    }

}

和例外:

com.thoughtworks.xstream.converters.ConversionException: Cannot convert type com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl to type java.util.Date
---- Debugging information ----
class               : SampleEntityJavaUtil
required-type       : SampleEntityJavaUtil
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path                : /SampleEntityGregorian.class/date
line number         : 2
version             : 1.4.7
-------------------------------
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:430)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:257)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1185)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1169)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1040)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1031)
    at com.eccles.tests.ConverterTests.testSerializationToGregCalendar(ConverterTests.java:87)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

提前致谢。

蒂姆

4

1 回答 1

0

我会说你正在做一件非常疯狂的事情。

如果您唯一的问题是使用的日期类型,您可以尝试自定义 JAXB 部分(wsimport 等)以使用 Date 而不是 XMLGregorianCalender。这是一个关于那个的链接。

接下来,您可能要考虑使用Dozer之类的东西在 bean 之间进行映射而不是重新编组。

这可能是一个非常肤浅的观点,但从我读到的内容来看,这种方法对我来说似乎并不合适。您在一个问题中提到了 wsimport/JAXB、XStream 和自己的工具。这不适合我。

于 2014-09-22T13:50:41.427 回答