标签: xmladapter

JAXB XMLAdapter方法不会抛出异常

我正在使用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进程继续读取下一个节点.我希望应用程序在抛出异常后立即停止.看来我的异常被吃光了.任何帮助深表感谢.

如何解决这个问题?

java jaxb unmarshalling xmladapter

16
推荐指数
1
解决办法
4942
查看次数

如何根据我的要求使用JAXB XML Adapter感到困惑

我正在使用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)

xml jaxb jaxb2 xmladapter

8
推荐指数
1
解决办法
2万
查看次数

JAXB @XmlAdapter:Map - > List adapter?(仅限马歇尔)

我有一个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 jaxb marshalling moxy xmladapter

8
推荐指数
1
解决办法
6171
查看次数

使用自定义jaxb绑定来获取xs:datetime到Joda时间但获取XMLGregorianCalender

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)

web-services wsdl2java jaxb jodatime xmladapter

5
推荐指数
1
解决办法
6436
查看次数

使用JAXB XmlAdapter在没有包装元素的情况下调整整个列表

我正在尝试使用一个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)

java xml jaxb unmarshalling xmladapter

5
推荐指数
0
解决办法
1000
查看次数

如何使用 JAXB XmlAdapter 来编组列表?

此类的实例是大型对象图的一部分,并且不在对象图的根部:

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注册了LocalDateLocalTime

问题是它只对date财产有效,而不是对times财产有效。我怀疑这与列表times而不是单个值有关。那么,我如何告诉 Jersey/JAXBtimes使用注册的来编组列表中的每个元素XmlAdapter

更新:

通过添加标量属性并观察 JSON 中的预期输出,我确认LocalTime编组确实适用于标量属性。LocalTimeLocalTime

为了完整起见,这里是 …

java json jaxb jersey xmladapter

2
推荐指数
1
解决办法
3万
查看次数