Dave Syer opened SPR-17007 and commented

If SourceHttpMessageConverter fails to initialize itself it blows up a RestTemplate and then the whole bean factory on startup:

Caused by: javax.xml.transform.TransformerFactoryConfigurationError: Provider com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl not found
    at java.lang.Throwable.<init>(Throwable.java:265)
    at java.lang.Error.<init>(Error.java:70)
    at javax.xml.transform.TransformerFactoryConfigurationError.<init>(TransformerFactoryConfigurationError.java:91)
    at javax.xml.transform.FactoryFinder.newInstance(FactoryFinder.java:181)
    at javax.xml.transform.FactoryFinder.find(FactoryFinder.java:261)
    at javax.xml.transform.TransformerFactory.newInstance(TransformerFactory.java:106)
    at org.springframework.http.converter.xml.SourceHttpMessageConverter.<init>(SourceHttpMessageConverter.java:86)
    at org.springframework.web.client.RestTemplate.<init>(RestTemplate.java:181)
    at org.springframework.boot.autoconfigure.http.HttpMessageConverters.getDefaultConverters(HttpMessageConverters.java:204)
    at org.springframework.boot.autoconfigure.http.HttpMessageConverters.<init>(HttpMessageConverters.java:106)
    at org.springframework.boot.autoconfigure.http.HttpMessageConverters.<init>(HttpMessageConverters.java:92)
    at org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration.messageConverters(HttpMessageConvertersAutoConfiguration.java:72)

The presence of a default implementation of TransformerFactory appears to be platform dependent, so RestTemplate and friends probably ought not to rely on their existence. E.g. a defensive type check might be needed.


Affects: 5.0.7

Issue Links: - #21529 Initial GraalVM native images (Substrate VM) support ("is depended on by")

Referenced from: commits https://github.com/spring-projects/spring-framework/commit/b09fad13a1f9517abd901587c9299bf5b65ed061

Comment From: spring-projects-issues

Sébastien Deleuze commented

The TransactionFactory implementation is very specific and can vary, so I chose to just catch the error thrown when instantiating SourceHttpMessageConverter when no impl is available.