JAXB无法将值转换为BigDecimal

时间:2018-11-02 20:52:00

标签: java spring spring-boot jaxb

在Spring Boot应用程序中,我正在使用 maven-jaxb2-plugin 从WSDL文件生成类:

<plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.14.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <schemaLanguage>AUTODETECT</schemaLanguage>
                    <schemaDirectory>src/main/resources</schemaDirectory>
                    <schemaIncludes>
                        <include>*.wsdl</include>
                    </schemaIncludes>
                    <generatePackage>pl.pantuptus.app.integration</generatePackage>
                </configuration>
            </plugin>

WSDL文件包含定义为:

销售字段
<s:element minOccurs="1" maxOccurs="1"
                        name="sales" type="s:decimal" />

maven-jaxb2-plugin 转换为所生成类的BigDecimal属性:

@XmlElement(name = "sales", required = true)
protected BigDecimal sales;

我在配置组件中显式配置JAXB Marshaller:

@Configuration
public class IntegrationConfig {
    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("pl.pantuptus.app.integration");
        return marshaller;
    }

    @Bean
    public MyClient myClient(Jaxb2Marshaller marshaller) {
        MyClient client = new MyClient();
        client.setDefaultUri("http://localhost:8080/ws");
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);
        return client;
    }
}

我的问题是,当我从客户端调用WS端点时:

getWebServiceTemplate().marshalSendAndReceive(url, request)

我收到的对象是 sales 属性的值为的对象。

我的猜测是JAXB无法正确解析此属性,因为它在响应中具有基于逗号的格式。

<sales>23 771,08</sales>

问题来了:我如何告诉Jaxb2Marshaller(或任何其他Marshaller实现)如何将这样的字符串转换成BigDecimal?

1 个答案:

答案 0 :(得分:0)

IntegrationConfig 中将验证器添加到编组器之后:

marshaller.setValidationEventHandler(new MyValidationEventHandler());

我发现未针对WSDL验证SOAP文档(销售值中带有逗号):

  

i.s.w.l.MyValidationEventHandler:链接的例外:   java.lang.NumberFormatException

我认为唯一的解决方案是请求正确的WSDL文件或对服务提供商的正确WS响应。