InstantiationException:jaxws中的java.math.BigDecimal:endpoint

时间:2014-03-06 12:51:11

标签: java spring jax-ws cxf

我有网络服务:

@SchemaValidation
@WebService(endpointInterface = "myEndpoint",
            portName = "myPort", serviceName = "myService")
public class MyEndpointImpl implements MyEndpoint {
用弹簧注射到CXF的码头:

<jaxws:endpoint
        id="myEndpoint"
        implementor="MyEndpointImpl"
        address="/myEndpoint"
        publishedEndpointUrl="http://000.000.00.215/endpoint">
    <jaxws:schemaLocations>
        <jaxws:schemaLocation>classpath:MyRequests.xsd</jaxws:schemaLocation>
    </jaxws:schemaLocations>
    <jaxws:properties>
        <entry key="schema-validation-enabled" value="true"/>
        <entry key="ws-security.bst.validator" value="org.apache.ws.security.validate.NoOpValidator"/>
    </jaxws:properties>
    <jaxws:inInterceptors>
        <ref bean="inbound-security"/>
        <ref bean="cryptoCoverageChecker"/>
    </jaxws:inInterceptors>
</jaxws:endpoint>

xsd包含decimal类型,使用当前xjc生成java类:

<xsd:element name="limitMin" type="xsd:decimal"/>
<xsd:element name="limitMax" type="xsd:decimal"/>

该服务有效,但我可以看到这样的日志声明,这让我感到紧张:

java.lang.InstantiationException: java.math.BigDecimal
Continuing ...
java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new();

我用Google搜索了大约10年的Sun解释和JAXB的一些解决方法:

PersistenceDelegate pd=encoder.getPersistenceDelegate(Integer.class);
encoder.setPersistenceDelegate(BigDecimal.class,pd );

但我无法直接访问它。该怎么办?我能以某种方式解决它吗?

1 个答案:

答案 0 :(得分:2)

看起来正在发生的事情是,marshaller尝试通过尝试调用它的空构造函数来序列化BigDecimal

BigDecimal没有空构造函数,因此序列化机制捕获异常并继续尝试以另一种方式序列化BigDecimal。根据{{​​3}}:

  

一个类必须有一个公共零参数构造函数或一个   静态零参数工厂方法,以便由此映射   注解。在解组时使用这些方法之一   创建一个类的实例。

因此序列化过程使用另一种方式转换BigDecimal,例如调用它知道的静态工厂方法,因为我们知道序列化最终会成功。

还可以向JAXB提供我们自己的静态工厂方法,该方法执行自定义转换。这样可以防止尝试首先调用空构造函数,看一下这个Oracle JAX-WS documentation的例子。

但是消息是一条调试消息,因此编组工作正常,然后可以通过降低编组器的日志记录级别来安全地忽略它。