当前位置: 首页 > 知识库问答 >
问题:

格式jaxb元素日期

太叔英锐
2023-03-14

我有下面这样的jaxb类,我希望我的xmlAdapter格式化日期值,我得到了异常

原因:java。lang.RuntimeException:com。太阳xml。绑定v2。运行时。IllegalAnnotationsException:1 IllegalAnnotationExceptions计数无效@XmlElementRef:Type“class java.lang.String”或其任何子类在此上下文中未知。

下面的代码有什么问题?

@XmlElementRef(name="endDate")
@XmlJavaTypeAdapter(DateAdapter.class)
protected JAXBElement<Date> endDate;
    public class DateAdapter extends XmlAdapter<String, JAXBElement<Date>>
    {
    private final String TIMEZONE_US_EASTERN = "US/Eastern";

    private final String LOCALE_LANGUAGE_EN = "en";

    private final String LOCALE_COUNTRY_US = "US";

    private final String DATE_FORMAT = "yyyy-MM-dd";

    private SimpleDateFormat dateFormat = null;

    private TimeZone timeZone = null;

    private Locale locale = null;

    public DateAdapter() {
        locale = new Locale(LOCALE_LANGUAGE_EN, LOCALE_COUNTRY_US);
        dateFormat = new SimpleDateFormat(DATE_FORMAT,locale);
        timeZone = TimeZone.getTimeZone(TIMEZONE_US_EASTERN);
    }

    @Override
    public String marshal(JAXBElement<Date> v) throws Exception {
        String timezone = getBasisForGivenDate(v.getValue());
        String startDayTime = "T23:59:59"+timezone;
        dateFormat.setTimeZone(timeZone);
        return dateFormat.format(v)+startDayTime;
    }


    @Override
    public JAXBElement<Date> unmarshal(String v) throws Exception {
        return null;
    }


    public String getBasisForGivenDate(Date date) {

        String basis = "-05:00";
        TimeZone jvmTimeZone = TimeZone.getDefault();

        if (jvmTimeZone.inDaylightTime(date)) {
            basis = "-04:00";
        }
        return basis;
    }
 }

共有1个答案

古棋
2023-03-14

有两种可能的决定:

>

如果要使用ObjectFactory创建对象,请执行以下操作

@XmlRegistry
public class ObjectFactory {

@XmlElementDecl(name = "endDate", scope=EntityTest.class)
JAXBElement<Date> createEndDate(Date value) {
    return new JAXBElement<Date>(new QName("endDate"), Date.class, value);
}

}

实体类是

    @XmlRootElement
    public class EntityTest {

    @XmlElementRef(type=JAXBElement.class, name="endDate")
    @XmlJavaTypeAdapter(DateAdapter.class)
    protected JAXBElement<Date> endDate;


    public void setEndDate(JAXBElement<Date> endDate) {
        this.endDate = endDate;
    }
}

然后你的DateAdapter应该是这样的:

public class DateAdapter extends XmlAdapter<JAXBElement<String>, JAXBElement<Date>> {
    private final String TIMEZONE_US_EASTERN = "US/Eastern";
    private final String LOCALE_LANGUAGE_EN = "en";
    private final String LOCALE_COUNTRY_US = "US";
    private final String DATE_FORMAT = "yyyy-MM-dd";
    private SimpleDateFormat dateFormat = null;
    private TimeZone timeZone = null;
    private Locale locale = null;

    public DateAdapter() {
        locale = new Locale(LOCALE_LANGUAGE_EN, LOCALE_COUNTRY_US);
        dateFormat = new SimpleDateFormat(DATE_FORMAT, locale);
        timeZone = TimeZone.getTimeZone(TIMEZONE_US_EASTERN);
    }

    @Override
    public JAXBElement<String> marshal(JAXBElement<Date> v) throws Exception {
        String timezone = getBasisForGivenDate(v.getValue());
        String startDayTime = "T23:59:59" + timezone;
        dateFormat.setTimeZone(timeZone);
        return new JAXBElement<String>(v.getName(), String.class, dateFormat.format(v.getValue()) + startDayTime);
    }

    @Override
    public JAXBElement<Date> unmarshal(JAXBElement<String> v) throws Exception {
        return null;
    }

    public String getBasisForGivenDate(Date date) {
        String basis = "-05:00";
        TimeZone jvmTimeZone = TimeZone.getDefault();

        if (jvmTimeZone.inDaylightTime(date)) {
            basis = "-04:00";
        }
        return basis;
    }
}

注意:SimpleDataFormat不是线程安全的,在单线程环境中使用它会导致多线程环境中出现错误。

检查it工作的单元测试:

@Test
public void testMarshaler() throws Exception {
    EntityTest entity = new EntityTest();
    JAXBElement<Date> date = new ObjectFactory().createEndDate(new Date());
    entity.setEndDate(date);
    JAXBContext context = JAXBContext.newInstance(EntityTest.class, ObjectFactory.class);
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
    marshaller.marshal(entity, System.out);

}
 类似资料:
  • 问题内容: 鉴于: 如何注释,以便XML为: 问题答案: 您可以利用注释执行以下操作。 oo 酒吧 想要查询更多的信息 http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html

  • 问题内容: 我有一个类似的xml: 我想将元素映射到类MyBean中的属性 有什么办法可以做到吗?我正在使用JDK 1.6随附的jaxb 问题答案: 注意: 我是 EclipseLink JAXB(MOXy)的 负责人,并且是 JAXB(JSR-222) 专家组的成员。 使用任何JAXB(JSR-222)实现 使用任何JAXB(JSR-222)实现,您都可以使用来映射此用例。 ThetaValue

  • 问题内容: 我创建了一种方法来解组xml(item.xml)文件。但是,如果有多个元素,如何遍历所有元素并使它们显示? 我的代码如下: 如果我的xml是 如何获取所有显示的值?谁能帮我? 问题答案: 我在大学的一些项目中使用过JAXB。据我所记得,您应该返回一个对象(例如),然后查询该对象以检索其中包含的元素。 因此,您的xml应该如下所示: 此时,您的 Java 代码将是:

  • 背景: 我使用JAXB将XML解组为Java对象。最初,我只是使用JAXB来执行解组。然后对代码进行静态分析,并提出了XML外部实体注入的高关键性问题。经过一点研究,我发现了一个建议(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXB_Unmarshaller)使用配置为防止解析

  • 我想删除提供的日期格式字符串的元素-例如通过删除任何非M/y元素将格式“dd/MM/yyyy”转换为“MM/yyyy”。 我尝试做的是基于为该地区提供的现有日/月/年格式创建本地化的月/年格式。 我已经使用正则表达式完成了这项工作,但解决方案似乎比我预期的要长。 示例如下:

  • 使用JAXB解封整个XML时,可以设置XML模式以在解析期间启用验证: 另一方面,当您从XML逐个解封的列表时(例如,为了减少内存使用),该方法失败(因为架构只接受根),但有一个例外: 即使在XSD中定义良好,它也会失败。是否有任何选项可以启用嵌套对象验证?请注意,定义新模式是一个糟糕的选项,因为对于由其他人维护的应用程序来说,XSD是外部的。