由于缺少@XmlRootElement批注,因此无法将类型封送为XML元素

catch23

我想将对象编组为XML。

但是,它失败,并带有以下异常:

javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.SAXException2: unable to marshal type "FreightOfferDetail" as an element because it is missing an @XmlRootElement annotation]
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:331)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:257)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:96)
    at com.wktransportservices.fx.test.util.jaxb.xmltransformer.ObjectTransformer.toXML(ObjectTransformer.java:27)
    at com.wktransportservices.fx.test.sampler.webservice.connect.FreightOfferToConnectFreight.runTest(FreightOfferToConnectFreight.java:59)
    at org.apache.jmeter.protocol.java.sampler.JavaSampler.sample(JavaSampler.java:191)
    at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:429)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257)
    at java.lang.Thread.run(Thread.java:662)
Caused by: com.sun.istack.SAXException2: unable to marshal type "FreightOfferDetail" as an element because it is missing an @XmlRootElement annotation
    at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:244)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:303)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328)

实际上,存在此注释(对于父类和交付的类):

@XmlRootElement(name = "Freight_Offer")
@XmlAccessorType(XmlAccessType.FIELD)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class FreightOffer {
    @JsonIgnore
    @XmlTransient
    private String freightId;
    private String id;

    private String externalSystemId;

    private AddressLocation pickUp;

    private AddressLocation delivery;

    private FreightDescription freightDescription;

    private ListContacts contacts;

    private Customer customer;

    private ListSla slas;

    private String pushId;

    private CompanyProfile company;

    private Route route;

    private String href;

    private Lifecycle lifecycle;

    private Visibility visibility;

    private Boolean unfoldedVXMatching;
    // getters / setters

子班:

@XmlAccessorType(XmlAccessType.PROPERTY)
public class FreightOfferDetail extends FreightOffer {

    private List<Contact> contact;

    @XmlElement(name = "contacts")
    @JsonProperty("contacts")
    public List<Contact> getContact() {
        return contact;
    }

    public void setContact(List<Contact> contact) {
        this.contact = contact;
    }

正是在这种方法下失败了toXML()

public class ObjectTransformer<T> implements Transformer<T> {

    protected final JAXBContext context;
    protected final Marshaller marshaller;

    protected final int okStatusCode = 200;
    protected final String okSubErrorCode = "OK";

    public ObjectTransformer(JAXBContext context) throws JAXBException {
        this.context = context;
        marshaller = context.createMarshaller();
        marshaller.setProperty("jaxb.encoding", "UTF-8");
        marshaller.setProperty("jaxb.formatted.output", Boolean.TRUE);
    }

    public String toXML(T object) throws JAXBException {
        StringWriter writer = new StringWriter();
        marshaller.marshal(object, writer);
        String xmlOffer = writer.toString();
        return xmlOffer;
    }

它应该工作,但是不应该。

我在这里找不到遗漏或错误的内容。

更新:

这是测试的片段:

public SampleResult runTest(JavaSamplerContext context) {
    AbstractSamplerResults results = new XMLSamplerResults(new SampleResult());
    results.startAndPauseSampler();

    if (failureCause != null) {
        results.setExceptionFailure("FAILED TO INSTANTIATE connectTransformer", failureCause);
    } else {
        FreightOfferDTO offer = null;
        FreightOffer freightOffer = null;
        try {
            results.resumeSampler();            

            RouteInfo routeDTO = SamplerUtils.getRandomRouteFromRepo(context.getIntParameter(ROUTES_TOUSE_KEY));

            offer = FreightProvider.createRandomFreight(routeDTO, createUserWithLoginOnly(context));

            freightOffer = connectTransformer.fromDTO(offer);
            String xmlOfferString = connectTransformer.toXML(freightOffer); // <- it fails here.

我从CSV文件获取日期并将其转换为DTO对象。这种方法回到我身边FreightOfferDetail.

这是此方法的摘录:

public FreightOfferDetail freightFromDTO(FreightOfferDTO freightDTO, boolean fullFormat){
    FreightOfferDetail freight = new FreightOfferDetail();

    freight.setFreightId(freightDTO.getIds().getAtosId());
    freight.setId(freightDTO.getIds().getFxId());
    // ...

在这种情况下,如何将对象编组为XML文件?

拉扎尔·拉扎罗夫(Lazar Lazarov)
public String toXML(T object) throws JAXBException {
  StringWriter stringWriter = new StringWriter();

  JAXBContext jaxbContext = JAXBContext.newInstance(T.class);
  Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

  // format the XML output
  jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

  QName qName = new QName("com.yourModel.t", "object");
  JAXBElement<T> root = new JAXBElement<Bbb>(qName, T.class, object);

  jaxbMarshaller.marshal(root, stringWriter);

  String result = stringWriter.toString();
  LOGGER.info(result);
  return result;
}

这是我必须在没有@XmlRootElement的情况下进行编组/解组时使用的文章:http : //www.source4code.info/2013/07/jaxb-marshal-unmarshal-with-missing.html

最好的希望是它会有所帮助:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试使用JAXB将对象编组为xml文件时,出现“缺少@XmlRootElement批注”错误

如何将大量数据封送为XML

如何使用Go将具有不同类型的一个元素的数组封送为JSON?

由于缺少程序集(.NET核心),因此无法通过MetadataLoadContext检查类型

具有自定义JAX-B绑定的JAX-WS MarshalException:无法将类型“ java.lang.String”作为元素封送

由于没有隐式引用转换,因此无法将类型用作类型参数

由于某些中间构造函数,因此无法使用类型为MySuperClass <B>的封闭实例

由于主键属性“ id”为空,因此无法跟踪类型的实体

由于缺少zsh,因此无法以root或用户身份登录

由于缺少键盘布局,因此无法登录Windows 7

由于缺少Content-Type,因此无法解码JSON

如何封送XML

将GWT从2.8.1升级到2.8.2后,出现“无法将XmlRootElement解析为类型”错误

如何将结构封送为匿名结构?

由于类型错误IntegrityError的对象无法通过JSON序列化,因此无法使用DRF将数据插入模型

由于“”不包含“ GetEnumerator”的公共定义,因此foreach语句获取错误无法对类型为“”的变量进行操作

由于产品类型列表为空,因此无法在iTunes Connect上创建初始应用内购买

由于 `slice[_]` 的类型为 `T`,它没有实现 `Copy` 特征,因此无法移出此处发生移动

Python使用缺少的元素将XML解析为DataFrame

由于类类型的转换错误,因此无法通过

将XML注释添加到封送的文件中

由于navigationController为nil,因此无法推送viewController

由于AndroidManifest.xml存在问题,因此无法构建APK

由于添加了“ ”,因此无法将文件读入数组 python

AH00035:由于路径的某个组件上缺少搜索权限,因此无法访问/拒绝(文件系统路径为'/ Users / xxx / Documents / workspace')

包裹:无法封送价值

由于缺少定义,因此无法在.net Core应用程序上构建

由于缺少mainClass,因此无法在Visual Studio中调试Flink示例

由于缺少Qt5Cored.dll,因此无法启动程序