2017-08-17 37 views
1

讓我提前感謝您的幫助!用xml和json與jackson進行Spring Boot只返回xml

我在彈簧引導應用程序中有一個奇怪的行爲。讓我來解釋一下你:

我包裝了一些與一些不錯的休息JSON的服務傳統的Web服務(自定義XML消息)(通過Spring-MVC和彈簧引導和利用傑克遜序列化的東西)

爲了與遺留系統進行通信,我創建了一個自定義的XmlMapper,序列化器和反序列化器。

最後,我已經創建了一個httpclientconfig,以定義一些HTTP連接屬性...

但啓動應用程序,並試圖訪問任何端點(如執行器的),應用程序只能返回後XML。事件招搖終點返回XML(是什麼讓招搖的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,因爲我我也正在開發一些圖書館,提供額外的服務(模塊化的東西)序列化器

我完全失去了這個。任何幫助將很多ap預...

關心!

回答

0

我已經解決了其擴展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/"); 
     } 
    } 

再次感謝!