我有网络服务:
@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 );
但我无法直接访问它。该怎么办?我能以某种方式解决它吗?
答案 0 :(得分:2)
看起来正在发生的事情是,marshaller尝试通过尝试调用它的空构造函数来序列化BigDecimal
。
但BigDecimal
没有空构造函数,因此序列化机制捕获异常并继续尝试以另一种方式序列化BigDecimal
。根据{{3}}:
一个类必须有一个公共零参数构造函数或一个 静态零参数工厂方法,以便由此映射 注解。在解组时使用这些方法之一 创建一个类的实例。
因此序列化过程使用另一种方式转换BigDecimal,例如调用它知道的静态工厂方法,因为我们知道序列化最终会成功。
还可以向JAXB提供我们自己的静态工厂方法,该方法执行自定义转换。这样可以防止尝试首先调用空构造函数,看一下这个Oracle JAX-WS documentation的例子。
但是消息是一条调试消息,因此编组工作正常,然后可以通过降低编组器的日志记录级别来安全地忽略它。