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

@XmlAnyElement不会解封为特定Java类型,而是停在JAXBElement

罗兴运
2023-03-14
@WebService(serviceName = "TestServices")
@Stateless()
public class TestServices {
    @WebMethod(operationName = "testMethod")
    public ServiceResult testMethod() {
        ServiceResult result = new ServiceResult();

        result.addObject(new SimpleObj(1, 2));
        result.addObject(new SimpleObj(3, 4));

        return result;
    }
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({SimpleObj.class})
public class ServiceResult {
    @XmlAnyElement(lax = true)
    private List<Object> body;

    public void addObject(Object objToAdd) {
        if (this.body == null)
            this.body = new ArrayList();

        this.body.add(objToAdd);
    }

    // Getters and Setters
}
public class Main {
    @WebServiceRef(wsdlLocation = "META-INF/wsdl/localhost_8080/TestServices/TestServices.wsdl")
    private static TestServices_Service service;
    private static TestServices         port;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        port = service.getAdminServicesPort();
        ServiceResult result = port.testMethod();

        for (Object o : result.getAny()) {
            System.out.println("TEST: " + o);
        }
    }
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SimpleObj {
    private int a;
    private int b;

    public SimpleObj() {}

    public SimpleObj(int a, int b) {
        this.a = a;
        this.b = b;
    }

    // Getters and Setters
}

共有1个答案

李睿
2023-03-14

我无法重复你所看到的问题。下面是一些直接与JAXB交互的演示代码。

import java.io.*;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(ServiceResult.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StringReader xml = new StringReader("<serviceResult><simpleObj/><simpleObj/></serviceResult>");
        ServiceResult result = (ServiceResult) unmarshaller.unmarshal(xml);

        for(Object item : result.getBody()) {
            System.out.println(item.getClass());
        }
    }

}

运行演示代码的输出显示,它是@XmlAnyElement(lax=true)注释的字段中SimpleObj的实例。

class forum27871349.SimpleObj
class forum27871349.SimpleObj

在附带说明中,我读过您关于@XmlAnyElement的博客文章,我从未见过您必须在任何示例中包含@XmlSeeAll({SimpleObj.Class})。

我不知道为什么在示例中从不使用@XmlSeeAllow

但是,在我的例子中,如果我没有这个,我会错误地说类***或者它的任何超级类都是这个上下文所知道的。如果您还能向我展示是否有一种不使用@XmlSeeAll就能让使用者知道所有这些类的方法,那就太好了

当您自己创建JAXBContext时,您只需包含在@XMLSeeAlsole注释中引用的任何内容,作为用于引导JAXBContext的类的一部分。

JAXBContext jc = JAXBContext.newInstance(ServiceResult.class, SimpleObj.class);

在不能直接访问jaxbcontext的JAX-WS(或JAX-RS)设置中,我建议您像以前一样使用@XMLSeeAllow注释。

关于@XmlAnyElement,从文档来看,我想如果解封程序不能将元素解封到JAXB对象或JAXBElement对象中,我至少会得到一个DOM节点。

当使用@XmlAnyElement(lax=true)映射属性时,将发生以下情况:

    null

下面我将用一个例子来演示。

对象工厂

import javax.xml.namespace.QName;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(name="simpleObjJAXBElement")
    public JAXBElement<SimpleObj> createSimpleObj(SimpleObj simpleObj) {
        return new JAXBElement<SimpleObj>(new QName("simpleObjJAXBElement"), SimpleObj.class, simpleObj);
    }

}

演示

import java.io.*;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(ServiceResult.class, ObjectFactory.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StringReader xml = new StringReader("<serviceResult><simpleObj/><unmapped/><simpleObjJAXBElement/></serviceResult>");
        ServiceResult result = (ServiceResult) unmarshaller.unmarshal(xml);

        for(Object item : result.getBody()) {
            System.out.println(item.getClass());
        }
    }

}
class forum27871349.SimpleObj
class com.sun.org.apache.xerces.internal.dom.ElementNSImpl
class javax.xml.bind.JAXBElement
 类似资料:
  • 我正在尝试制作一个俄罗斯方块游戏,我得到了编译器错误 当我尝试创建对象时 我对每个形状都使用内部类。这是我的部分代码 我做错了什么?

  • 我想把字符串xml转换成对象类型类。因为我有一个返回对象类型的rest服务。因为我需要根据响应字符串将响应作为动态创建的xml返回。但是,当我试图将字符串xml转换为对象类时,它显示了以下错误: UnmarshalException:意外元素

  • 问题内容: 在正确掌握接口最佳实践的过程中,我注意到一些声明,例如: 代替 -据我所知,原因是因为它有一定的灵活性,以防万一你不想实现ArrayList,但又可能实现另一种类型的列表。 通过这种逻辑,我建立了一个示例: 我的问题是,我无法访问batheSelf()方法,因为它仅适用于Cat。这使我相信,仅在使用接口中声明的方法时才应从接口声明(而不是子类中的其他方法),否则应直接从类中声明(在本例

  • 问题内容: 我正在使用反射来查看附加到类的属性的注释是否具有特定类型。目前我正在做: 这让我有些不高兴,因为它依赖于完全合格的类名称的字符串。如果将来更改命名空间,则可能会导致细微的错误。 我想要做: 但是是抽象类,无法实例化。有没有一种方法可以针对接口或抽象类进行模拟(或基本上使用)? 问题答案: 你只是在寻找 ?

  • 假设我们开发了一个简单的博客网站后端,应用程序有三个或更多的POJO类,比如Post、User、Category。所有类都有相同的字段,例如“id”、“createdDate”、“updateDate”。作为java程序员,我们使用私有访问修饰符来封装类中的所有字段。我的问题很简单:我们可以使用带有继承的默认访问修饰符来执行封装吗?让我们以代码的形式呈现:

  • 问题内容: 假设我有三个隔离的公共类(没有IS-A关系)A,B和C。我想在C中定义一个字段,使其类型可以是A或B。 目前,我通过定义C来实现这一目标: 上面的代码仅在运行时会引发异常。但是,我更希望在使用A或B以外的任何类型构造C的情况下,在编译时本身抛出错误,以生成编译器错误。 问题答案: 将构造函数设为私有: 然后提供静态工厂方法来创建特定类型的实例: 这不会阻止您使用 类型 ; 您只是无法创