@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
}
我无法重复你所看到的问题。下面是一些直接与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)
映射属性时,将发生以下情况:
下面我将用一个例子来演示。
对象工厂
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的情况下,在编译时本身抛出错误,以生成编译器错误。 问题答案: 将构造函数设为私有: 然后提供静态工厂方法来创建特定类型的实例: 这不会阻止您使用 类型 ; 您只是无法创