class XXX nor any of its super class is known to this context

class XXX nor any of its super class is known to this context.

 用CXF传递复杂的数据类型,比如dto

@XmlType(name = "Customer")
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
	private long id;
	private String name;
	private Date birthday;
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

 interface

 

@WebService
public interface TestService {
	String testString(String name);
	int testInt(int a, int b);
	List<String> testList(List<String> list);
	Customer testObject(Customer c);
}

 实现类

public Customer testObject(Customer c) {
		Customer ct = new Customer();
		ct.setId(2L);
		ct.setName("11");
		ct.setBirthday(new Date());
		return ct;
	}

 测试类

public void testObject() {
		try {
			Customer ct = new Customer();
			ct.setId(1L);
			ct.setName("33");
			ct.setBirthday(new Date());
			Object obj[] = client.invoke("testObject", ct);
			Customer cc = (Customer) obj[0]; 
			System.out.println(ct.getBirthday());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

当调用的时候,报错

Caused by: javax.xml.bind.JAXBException: class com.infodms.ws.dto.Customer nor any of its super class is known to this context.
	at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:594)
	at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:648)
	... 41 more

 上网搜了一下,找不到合理的解释,把testObject的参数去掉,只留下返回值,报错

java.lang.ClassCastException: com.infodms.ws.test.Customer cannot be cast to com.infodms.ws.dto.Customer

 奇怪了Customer类明明是dto包中的类怎么cxf认为是test包中的类,原来接口和实现类都是test包中的类,cxf在object和xml转换的时候会默认在同一个包下面找dto,如果找不到则报错,把这个dto跟接口和实现类放到同一个包下面,问题解决。

 

 

我如果不想把dto和接口放到同一个包下面又该怎么办呢?我们需要在dto的上面定义它的namespace,注意这个字符串跟包名的顺序是相反的

@XmlType(name = "Customer", namespace = "dto.ws.infodms.com")

 问题解决。

 

 

 

1 楼 corleonelu 2011-12-20  
弄了一个下午了,终于可以吃饭了,class XXX nor any of its super class is known to this context