我有下面这样的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;
}
}
有两种可能的决定:
>
如果要使用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是外部的。