SourceHttpMessageConverter 預設沒有註冊類別

此規則標記使用 javax.xml.transform.Source 介面時 SourceHttpMessageConverter 類別是 找不到 找不到。 在 Spring Framework 6.0 中 SourceHttpMessageConverter 類別是 不再 在 Spring MVC 或 RestTemplate.

因此, Spring 網路應用程式使用 javax.xml.transform.Source 現在需要 設定 SourceHttpMessageConverter 明確。 需要注意的是,轉換器註冊的順序很重要。 例如, SourceHttpMessageConverter 應該 應在 「包羅萬象 」的轉換器之前註冊,例如 MappingJackson2HttpMessageConverter.

下面的程式碼片段顯示了 javax.xml.transform.Source:


                @RestController
                public class TransformController {
                    @GetMapping(value = "/transform", produces = MediaType.TEXT_HTML_VALUE)
                    public String transformXml() throws Exception{
                        Source xmlSource = new StreamSource(new ClassPathResource("sample.xml").getInputStream());
                        Source xsltSource = new StreamSource(new ClassPathResource("transform.xslt").getInputStream());
                        StringWriter writer = new StringWriter();
                        Result result = new StreamResult(writer);
                        TransformerFactory factory = TransformerFactory.newInstance();
                        Transformer transformer = factory.newTransformer(xsltSource);
                        transformer.transform(xmlSource, result);
                        return writer.toString();
                    }
                }  
             

在 Spring Framework 6.0 中,控制器程式碼保持不變,但需要額外的設定步驟,以確保其正常運作。 以確保其正常運作。 您可以註冊 SourceHttpMessageConverter 手動 在 Configuration 代碼。 以下是此使用個案的範例:

            @Configuration
            public class WebConfig implements WebMvcConfigurer{
                @Override
                public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
                    converters.add(new SourceHttpMessageConverter<>());
                }
            }
            

或者,您可以設定 SourceHttpMessageConverter 在一個 RestTemplate 如果您使用它來 從外部服務擷取 XML。 以下是此使用個案的範例:

            @Bean
            public RestTemplate restTemplate() {
                RestTemplate restTemplate = new RestTemplate();
                restTemplate.getMessageConverters().add(new SourceHttpMessageConverter<>());
                return restTemplate;
            }       
            

如需相關資訊,請參閱下列資源: