当前位置: 首页 > 知识库问答 >
问题:

带有xml的Spring Boot和带有jackson的json只返回xml

甄志
2023-03-14

让我预先感谢你的帮助!

我在一个spring boot应用程序中有一个奇怪的行为。我来给你解释一下:

我正在用一些不错的rest-json服务包装一些遗留的Web服务(自定义xml消息)(通过spring-mvc和Spring boots并使用jackson序列化东西)

为了与遗留系统通信,我创建了一个自定义XmlMapper、序列化器和反序列化器。

最后,我创建了一个httpclientconfig,以定义一些http连接属性。。。

但在启动应用并尝试访问任何终结点(例如执行器终结点)后,应用仅返回 xml。Event swagger endpoints 返回 xml(是什么让 swagger-ui 变得疯狂。

以下是一些类:

    @Configuration
    public class HttpClientConfig {
        private static final Logger logger = LoggerFactory.getLogger(HttpClientConfig.class);
        @Value(value = "${app.http.client.max_total_connections}")
        public String MAX_TOTAL_CONNECTIONS;

        @Value(value = "${app.http.client.max_connections_per_route}")
        public String MAX_CONNECTIONS_PER_ROUTE;

        @Value(value = "${app.http.client.connection_timeout_milliseconds}")
        public String CONNECTION_TIMEOUT_MILLISECONDS;

        @Bean
        public ClientHttpRequestFactory httpRequestFactory() {
            return new HttpComponentsClientHttpRequestFactory(httpClient());
        }
        @Autowired 
        private XmlMapper xmlMapper;
        @Bean
        public RestTemplate restTemplate() {
            RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
            List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();

            for (HttpMessageConverter<?> converter : converters) {
                if (converter instanceof MappingJackson2HttpMessageConverter) {
                    MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) converter;
                    jsonConverter.setObjectMapper(new ObjectMapper());
                }
                if (converter instanceof MappingJackson2XmlHttpMessageConverter) {
                    MappingJackson2XmlHttpMessageConverter jsonConverter = (MappingJackson2XmlHttpMessageConverter) converter;              
                    jsonConverter.setObjectMapper(xmlMapper);
                }
            }

            logger.debug("restTemplate object created====================================");
            return restTemplate;
        }

        @Bean
        public HttpClient httpClient() {
            HttpClient httpClient = null;
            try {
                HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();

                // disable SSL check
                SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                    @Override
                    public boolean isTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
                            throws CertificateException {
                        return true;
                    }
                }).build();
                httpClientBuilder.setSSLContext(sslContext);
                // don't check Hostnames
                HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
                SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
                Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                        .register("http", PlainConnectionSocketFactory.getSocketFactory())
                        .register("https", sslSocketFactory).build();

                PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
                connMgr.setMaxTotal(Integer.parseInt(MAX_TOTAL_CONNECTIONS));
                connMgr.setDefaultMaxPerRoute(Integer.parseInt(MAX_CONNECTIONS_PER_ROUTE));
                RequestConfig config = RequestConfig.custom()
                        .setConnectTimeout(Integer.parseInt(CONNECTION_TIMEOUT_MILLISECONDS)).build();

                httpClientBuilder.setDefaultRequestConfig(config);
                httpClientBuilder.setConnectionManager(connMgr);

                // to avoid nohttpresponse
                httpClientBuilder.setRetryHandler(new HttpRequestRetryHandler() {

                    @Override
                    public boolean retryRequest(IOException exception, int executionCount,
                            org.apache.http.protocol.HttpContext context) {
                        // TODO Auto-generated method stub
                        return true;
                    }
                });
                httpClient = httpClientBuilder.build();
            } catch (Exception e) {
                logger.error("Excption creating HttpClient: ", e);
            }
            return httpClient;
        }
    }

和xml映射器

    @Configuration
    public class XmlMapperConfig{

        @Bean
        public XmlMapper getXmlMapper() {
            XmlMapper mapper=new XmlMapper();       
            SimpleModule module = new SimpleModule();       
            module.addSerializer(CafRequestObject.class, new CafRequestObjectSerializer());
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            mapper.registerModule(module);      
            mapper.findAndRegisterModules();
            CafXmlSerializationProvider cafXmlProvider=new CafXmlSerializationProvider(new XmlRootNameLookup());        

            mapper.setSerializerProvider(cafXmlProvider);
            return mapper;
        }


    }

我调用findAndregisterModules,因为我也在开发一些库,为服务提供额外的序列化器(模块化的东西)

我完全不明白。任何帮助都将不胜感激...

问候!

共有1个答案

蒙勇
2023-03-14

我通过扩展WebMvcConfigurerAdapter解决了这个问题:

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {


        @Override
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
            configurer.defaultContentType(MediaType.APPLICATION_JSON);
        }
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry
                .addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
            registry
                .addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        }
    }

再次感谢!

 类似资料:
  • 问题内容: 我相信它在某个时候可以工作,但是现在xpath返回null。有人可以帮助我在以下代码中找到我的愚蠢错误吗? 还是即使在setNamespaceAware(false)之后也必须提供NamespaceContext? XML文档在这里: 问题答案: 三个选择是显而易见的。按照我的观点,最简单的顺序是: 将XPath从更改为。有点笨拙,但它将忽略名称空间。如果仍然为您提供零,则说明问题不在

  • 所以我得到了一个xml文件从肥皂服务(我无法控制)。它返回了一个xmlns,这导致了简单的XML问题。我正在运行一个str_replace来解决这个问题,但是现在simpleXML只返回一个空对象。XML结构看起来很好,没有错误,只是一个空对象。 返回:SimpleXMLElement对象() str replace之前的XML源是: 更换后: 任何帮助都将不胜感激,这快把我逼疯了! ----因此

  • 我是Java和Springboot的新手。尝试使用一个参数terminalId(字符串)实现一个简单的get请求。 我完全迷路了。

  • 我正在尝试使用ASP.NET Web API返回一个JSON文件(用于测试)。 在Fiddler中,它确实显示为Json类型,但当我在Chrome中调试并查看对象时,它显示为单独行数组(左)。正确的图像是当我在使用它时该对象应该看起来的样子。 有人能告诉我应该返回什么来实现正确格式的Json结果吗?

  • 我试图编写一个方法,它接受@PathVariable参数,并将用户重定向到一个jsp文件。 @pathvariable(value=“customerId”)字符串customerId @pathvariable(name=“customerId”)字符串customerId @pathvariable(“customerId”)字符串customerId 谢谢你的帮助。

  • 本文向大家介绍Java Web Service返回带有>和相关面试题,主要包含被问及Java Web Service返回带有>和时的应答技巧和注意事项,需要的朋友参考一下 框架正在按照您所说的去做。您的方法返回,表示生成的WSDL应该具有类型为的响应消息。众所周知,XML字符串必须将某些字符编码为字符实体引用(即“ ”变为“ ”,因此XML解析器将其视为字符串,而不是您期望的XML元素的开头)。如