JAX-WS SEI中使用的类的无参数构造函数

时间:2011-12-07 16:43:15

标签: web-services jax-ws cxf

我正在开发一个小小的Web服务并遇到了一个我不明白的细节。

这是我的服务端点接口的一部分:

@WebService
public interface ScriptStarterInterface {
  String getResult(@WebParam(name="newFile") FileContainer newFile);
}

也有它的实现。 ;)
现在,当我启动服务器时,发生以下异常:

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
some.package.FileContainer does not have a no-arg default constructor.

我将no-arg构造函数添加到FileContainer,现在一切正常。我不明白的是:为什么我必须提供这个构造函数?

我偶然发现的所有oracle页面都说我必须提供一个,但绝不是为什么。 :(

1 个答案:

答案 0 :(得分:1)

需要一个无参数构造函数,因为JAXB使用newInstance()的{​​{1}}方法创建了对象的实例,这不允许指定参数。 (我们可以知道JAXB由于该异常的包名而出现问题。)虽然可以通过获取适当的java.lang.Class实例然后在那里提供正确的参数来创建对象实例,但是更多复杂因此通常保留给非常复杂的框架(例如,Spring)。简单的代码使用简单的API,它需要一个无参数的构造函数;这对于大多数情况来说都是足够好的,你想要以编程的方式创建对象(对于JAXB,复杂的情况是通过注册工厂对象来处理的,工厂对象本身必须具有无参数构造函数但可以使对象具有更高的复杂性)。