@XmlJavaTypeAdapter与带有java.time.LocalDateTime的@XmlSchemaType



我正在Netbeans(8)中开发EJB模块和JAVAFX客户端中的JAXWS(部署在Glassfish 4.0上)。我正在使用IDE从Java类的方向构建WS。我正在努力通过WS-传递java.time.LocalDateTime并在客户端中获取LocalDateTime。

重要的是,我需要/想一起开发服务器和客户端!如果我更改了WS,WSDL也更改了,它应该由Netbeans(通过JAXWS)立即传播到客户端源代码(类型安全),但不知何故,它不适用于java.time(.localdate)..

某种原因是WS在编组期间不向LocalDateTime字段写入任何内容。为什么?这是我用的一个好方法吗 我错过什么了吗?谢谢

如果我在WebService中使用@XmlJavaTypeAdapter来处理LocalDateTime封送到String,XSD生成会将xs:String放入我的LocalDateTime字段。。。因此@XMLSchemaType被@XmlJavaTypeAdapter覆盖如何解决此问题

服务器端,在WebService中,我使用包级别

    @XmlSchemaTypes({
      @XmlSchemaType(name="date", type=LocalDate.class)
      ,@XmlSchemaType(name="dateTime", type=LocalDateTime.class)
      ,@XmlSchemaType(name="time", type=LocalTime.class)
    })

这使得IDE生成正确的XSD元素,例如包含

    <xs:element name="validTo" type="xs:dateTime" minOccurs="0"/>

服务器上的XmlADapter:(如果我用@XmlJavaTypeAdapter(String,LocalDateTime)注入它,则XSD生成将从LocalDateTime创建String。)

    public class LocalDateTimeAdapter
        extends XmlAdapter<String, LocalDateTime>{
        @Override
        public LocalDateTime unmarshal(String v) throws Exception {
            return LocalDateTime.parse(v,DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        }
        @Override
        public String marshal(LocalDateTime v) throws Exception {
            return v.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        }
    }

在客户端,我附加了WS,让IDE生成类。我向附加的Web服务添加了一个外部绑定文件和一个适配器类来处理LocalDateTime字段:

绑定文件:

            <jxb:globalBindings>
                <jxb:javaType name="java.time.LocalDateTime" xmlType="xs:dateTime"
                      parseMethod="test.app.utils.JaxBDateConverter.parseDateTime"
                      printMethod="test.app.utils.JaxBDateConverter.printDateTime" />
                <jxb:javaType name="java.time.LocalDate" xmlType="xs:date"
                      parseMethod="test.app.utils.JaxBDateConverter.parseDate"
                      printMethod="test.app.utils.JaxBDateConverter.printDate" />
                <jxb:javaType name="java.time.LocalTime" xmlType="xs:time"
                      parseMethod="test.app.utils.JaxBDateConverter.parseTime"
                      printMethod="test.app.utils.JaxBDateConverter.printTime" />
            </jxb:globalBindings>
        </jxb:bindings> 
    </jxb:bindings>

客户端上的适配器类:包test.app.client;

    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.time.format.DateTimeFormatter;
    public class JaxBDateConverter {
    static final DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    static final DateTimeFormatter df = DateTimeFormatter.ISO_LOCAL_DATE;
    static final DateTimeFormatter tf = DateTimeFormatter.ISO_LOCAL_TIME;
    public static LocalDateTime parseDateTime(String s) {
        try {
            if (s.trim().isEmpty()) {
                return null;
            } else {
            }
            LocalDateTime r = LocalDateTime.parse(s, dtf);
            return r;
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
    public static String printDateTime(LocalDateTime d) {
        try {
            if (d == null)
                return null;
            return d.format(dtf);
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
    public static LocalDate parseDate(String s) {
        try {
            if (s.trim().isEmpty()) {
                return null;
            } else {
            }
            LocalDate r = LocalDate.parse(s, df);
            return r;
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
    public static String printDate(LocalDate d) {
        try {
            if (d == null)
                return null;
            return d.format(df);
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
    public static LocalTime parseTime(String s) {
        try {
            if (s.trim().isEmpty()) {
                return null;
            } else {
            }
            LocalTime r = LocalTime.parse(s, tf);
            return r;
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
    public static String printTime(LocalTime d) {
        try {
            if (d == null)
                return null;
            return d.format(tf);
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
    }

WS不向LocalDateTime字段写入任何内容的原因编组期间。为什么?这是我创造的一个好方法吗?我想念吗某物谢谢

java.time.LocalDateTime类型是在最新的JAXB(JSR-222)发布后添加的,因此目前需要一个XmlAdapter来处理转换。


如果我在WebService中使用@XmlJavaTypeAdapter来处理LocalDateTime编组,XSD生成将xs:string放入我的localDateTime字段。。。因此@XMLSchemaType被@XmlJavaTypeAdapter覆盖。怎样我能解决这个问题吗?

@XmlJavaTypeAdapter不会覆盖@XmlSchemaType。相反,所引用的CCD_ 5正在将CCD_ 6转换为CCD_。现在,就JAXB而言,它现在是String属性,因此@XmlSchemaType不再适用。


我该如何解决此问题?

可以直接在经过调整的LocalDateTime属性上使用@XmlSchemaType注释。

@XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
@XmlSchemaType(name="dateTime")
public LocalDateTime getMyLocalDateTime() {
    return myLocalDateTime;
}

相关内容

  • 没有找到相关文章

最新更新