我正在使用JAXB XMLadapter来编组和解组布尔值.应用程序的XML文件也将由C#应用程序访问.我们必须验证此XML文件,这是使用XSD完成的.C#应用程序为布尔节点写入"True"值.但是我们的XSD也证实了这一点,因为它只允许"真/假"或"1/0".因此,我们在XSD中保留了String的布尔值,并且该字符串将由XMLAdapter验证,以便我们编组和解组.XML Adapter如下:
public class BooleanAdapter extends XmlAdapter<String, Boolean> {
@Override
public Boolean unmarshal(String v) throws Exception {
if(v.equalsIgnoreCase("true") || v.equals("1")) {
return true;
} else if(v.equalsIgnoreCase("false") || v.equals("0")) {
return false;
} else {
throw new Exception("Boolean Value from XML File is Wrong.");
}
}
@Override
public String marshal(Boolean v) throws Exception {
return v.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在正常情况下工作,但是当从xml文件中读取无效数据(例如:"abcd"或"")时,则抛出"new new Exception();" 没有传播,Unmarshal进程继续读取下一个节点.我希望应用程序在抛出异常后立即停止.看来我的异常被吃光了.任何帮助深表感谢.
如何解决这个问题?
我正在使用JAXB进行解组过程,请求来自UI到我们的服务类.以下是XML请求的格式.
<SampleRequest user="testUser" account="testAccount" Specifier= "value1a,value1b,value1c : name2a,value2b,value2c"/>
Run Code Online (Sandbox Code Playgroud)
我的要求是,Specifier属性有多个值系列(:冒号分隔)我需要将每个值系列映射到我的自定义java类
我试过这种方式
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SampleRequest {
@XmlAttribute
private String user;
@XmlAttribute
private String account;
@XmlAttribute(name="Specifier")
private List<Specifier> specifier;
}
Run Code Online (Sandbox Code Playgroud)
Specifier.java
@XmlJavaTypeAdapter(SpecifierAdapter.class)
public class Specifier {
}
Run Code Online (Sandbox Code Playgroud)
SpecifierAdapter.java
public class SpecifierAdapter extends XmlAdapter{
@Override
public Object marshal(Object arg0) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public Object unmarshal(Object arg0) throws Exception {
// TODO Auto-generated method stub
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑部分
类Specifier有3个String属性.
class Specifier
{ …Run Code Online (Sandbox Code Playgroud) 我有一个Map<String, String>.
每个人的第一个想法是将其转换为List<Pair<String,String>>(Pair作为自定义类).
我试过@XmlAdapter这样的:
public class MapPropertiesAdapter extends XmlAdapter<List<Property>, Map<String,String>> { ... }
Run Code Online (Sandbox Code Playgroud)
但Eclipse MOXy,我使用的JAXB impl,最终得到了ClassCastException- "无法将HashMap转换为Collection".
JAXB是否支持此转换?或者我忽略了一些文档部分,它解释了为什么不是?
PS:我想得到这样的XML:
<properties>
<property name="protocol"/>
<property name="marshaller"/>
<property name="unmarshaller"/>
<property name="timeout"/>
...
</properties>
Run Code Online (Sandbox Code Playgroud)
我明白了,只需要使用中级课程.还在XMLCompositeObjectMappingNodeValue.marshalSingleValue(XMLCompositeObjectMappingNodeValue.java:161)中的Handle NPE中进行了描述
Java 1.7 Spring 3.1.1 with Spring-WS 2.1.1 Joda Hibernate 3.6 MySQL 5.0.57 Maven 3 Tomcat 7 Eclipse 3.7
已部署Web服务并部署Web客户端,Web服务和Web客户端相互通信.
但就像在老式的视频游戏中一样,杀死一批龙只会产生另一批龙.
现在它是整个Joda Datetime xs:dateTime jaxb绑定的东西,它向我喷火.
谷歌搜索提出了许多我试图遵循的解决方案.
代表实体
@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;
....
}
Run Code Online (Sandbox Code Playgroud)
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 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用一个XmlAdapterunmarshal XML到一个自定义集合类型(Collection由于另一个类的使用所施加的冲突限制,故意不实现接口,如果该类包含任何集合,这很可能会失败).难点在于XML放置在集合中的节点不会包装在包装元素中.
这是我的XML基本面貌:
<xml>
<foo></foo>
<bar>1</bar>
<bar>2</bar>
</xml>
Run Code Online (Sandbox Code Playgroud)
我可以JAXB解决以下问题POJO:
class Naive {
Foo foo;
List<Bar> bar;
}
Run Code Online (Sandbox Code Playgroud)
但是,我想要做的是以下内容:
class Bars {
// There will be a fixed number of these, known in advance
Bar bar1;
Bar bar2;
}
class BarsAdapter extends XmlAdapter<ArrayList<Bar>, Bars> {
...
}
class Custom {
Foo foo;
@XmlJavaTypeAdapter(BarsAdapter.class) // won't work
Bars bar;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我编写了一个XmlAdapter想要调整整个列表的内容,而不是单个元素,但它从不会被调用以进行解组.(它会被调用以进行编组.)
如果我XML在<bar>元素周围包含一个包装器,那么我知道如何解决这个问题:
<xml> …Run Code Online (Sandbox Code Playgroud) 此类的实例是大型对象图的一部分,并且不在对象图的根部:
public class Day
{
public Day(LocalDate date, List<LocalTime> times)
{
this.date = date;
this.times = times;
}
public Day()
{
this(null, null);
}
public LocalDate getDate()
{
return date;
}
public List<LocalTime> getTimes()
{
return times;
}
private final LocalDate date;
private final List<LocalTime> times;
}
Run Code Online (Sandbox Code Playgroud)
使用 Jersey 和 JAXB 将对象图转换为 JSON。我已经XmlAdapter注册了LocalDate和LocalTime。
问题是它只对date财产有效,而不是对times财产有效。我怀疑这与列表times而不是单个值有关。那么,我如何告诉 Jersey/JAXBtimes使用注册的来编组列表中的每个元素XmlAdapter?
更新:
通过添加标量属性并观察 JSON 中的预期输出,我确认LocalTime编组确实适用于标量属性。LocalTimeLocalTime
为了完整起见,这里是 …
jaxb ×6
xmladapter ×6
java ×4
xml ×2
jaxb2 ×1
jersey ×1
jodatime ×1
json ×1
marshalling ×1
moxy ×1
web-services ×1
wsdl2java ×1