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

Spring Boot-HttpMessageConverter JSONP(应用程序/javascript)

莘昊
2023-03-14

调用了一个RESTendpoint,该endpoint在响应体中返回基本JSON,但内容类型响应头设置为application/javascript。

这是我的标准RestTemboard bean:

 RestTemplateBuilder restBuilder = new RestTemplateBuilder();
    return restBuilder.setConnectTimeout(connectTimeout)
            .setReadTimeout(readTimeout)
            .build();

当我使用此模板发出getForObject请求时,默认转换器无法处理响应,我得到一个异常:

org.springframework.web.client.RestClientException:无法提取响应:没有找到合适的HttpMessageConverter的响应类型[类我的响应Obj]和内容类型[应用程序/javascript]

在通常的转换之前,是否有一些快速配置可以添加到RestTemplate中以处理此响应?

我目前的工作只是将响应转换为String而不是我的域对象,然后使用ObjectMapper手动创建我的对象,但这感觉有点脏。

共有2个答案

邵浩大
2023-03-14

您应该能够自定义HttpMessageConverter,以使用应用程序/javascript媒体类型:https://dzone.com/articles/customizing

这样的东西可能有用,但我没有测试这个:

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        jsonConverter.getSupportedMediaTypes().add(new MediaType("application/javascript"));

        return jsonConverter;
    }

现在,我改编自的教程重点关注RestController,而不是RestTemplate。如果不起作用,可以手动创建converter对象,并在RestTemplate对象上设置HttpMessageConverters,而不是使用bean:

restTemplate.getMessageConverters().add(jsonConverter);

关键是将适当的转换器映射到正确的媒体类型,在您的应用程序/javascript中。

颛孙信厚
2023-03-14

我发现的最佳选择如下:

//Create a new converter class, that it's basically the same jackson, but it works with when header is javascript
public class JavaScriptMessageConverter extends AbstractJackson2HttpMessageConverter {

    //Add a new mediatype converter
    private JavaScriptMessageConverter() {
        super(Jackson2ObjectMapperBuilder.json().build(),new MediaType("application","javascript"));
    }
}

//Other class...

//Then add the converter to your rest template
restTemplate.getMessageConverters().add(new JavaScriptMessageConverter());
//Of course you can define the class also a bean and have it as singleton

我检查了这个免费的API,这正是你的问题:http://api.coindesk.com/v1/bpi/currentprice.json

16-11-2018 12:02:06.885 [http-nio-12000-exec-1] [process,,,] [] INFO  i.z.m.w.r.ArchRestLoggingInterceptor.logResponse - BitcoinService, Response with status code: 200, headers: {Content-Type=[application/javascript], Content-Length=[672], Access-Control-Allow-Origin=[*], Cache-Control=[max-age=15], Date=[Fri, 16 Nov 2018 11:02:06 GMT], Expires=[Fri, 16 Nov 2018 11:03:07 UTC], Server=[nginx/1.12.1], X-Powered-By=[Fat-Free Framework], X-Cache=[Miss from cloudfront, MISS from ced01squidp02.replynet.prv], X-Amz-Cf-Id=[v3NAF9Z0C5SiQrgLuAsxDgUQBP1-oLWUviHvS_9mOaFk7XrSAu7ZMQ==], X-Cache-Lookup=[MISS from ced01squidp02.replynet.prv:8080], Via=[1.1 1b96443527f684c809162d975cdd968f.cloudfront.net (CloudFront), 1.1 ced01squidp02.replynet.prv (squid/3.5.21)], Connection=[keep-alive]}, raw response: {"time":{"updated":"Nov 16, 2018 11:02:00 UTC","updatedISO":"2018-11-16T11:02:00+00:00","updateduk":"Nov 16, 2018 at 11:02 GMT"},"disclaimer":"This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchan...org","chartName":"Bitcoin","bpi":{"USD":{"code":"USD","symbol":"$","rate":"5,583.3925","description":"United States Dollar","rate_float":5583.3925},"GBP":{"code":"GBP","symbol":"£","rate":"4,363.6892","description":"British Pound Sterling","rate_float":4363.6892},"EUR":{"code":"EUR","symbol":"€","rate":"4,923.4020","description":"Euro","rate_float":4923.402}}}
 类似资料:
  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 完成干净的构建后,我将war文件复制到Tomcat的文件夹中。但是部署会发生两次,并且在上下文已经存在的情况下以异常结束。我错过了什么? 非常感谢您的帮助。

  • 我正在将一个非常基本的web应用程序部署到Google应用程序引擎。我使用的是Springboot,我可以在本地很好地运行应用程序,但当我部署到Google时,应用程序引擎不会启动实例。我在启动时配置了一个云SQL数据源。 我有云sql配置属性配置src/main/Resources/application.properties.App Engine似乎找不到这些属性,所以它无法正确设置Cloud

  • 这是我使用SpringBoot的第一天,我试图理解体系结构,因此我开始构建一个hello world应用程序: 在我的pom.xml中,在maven-shade-plugin下,我将mainClass声明如下: 文件目标是src/main/java/com/demo/helloworld.java,该文件中的代码是: 我错过了什么?

  • 我需要在Spring-boot应用程序中使用默认的ObjectMapper作为单个实例。我是否可以简单地在应用程序内部@autowire ObjectMapper(在Spring-boot应用程序中默认创建的实例)而不创建@bean(因为我不想更改ObjectMapper的任何功能) https://docs.spring.io/spring-boot/docs/current/reference

  • 我在src/main/resources下创建了2个文件: 应用程序。属性 第一个具有从env变量中获取值的属性,而后者具有固定值。 根据这里的具体情况,我以这样的方式推出了Spring靴: 然而,不会产生任何影响,并且应用程序是局部的。属性似乎被忽略。 有什么提示吗?

  • 2020-06-26T09:26:58.880610+00:00Heroku[web.1]:状态从开始更改为>崩溃2020-06-26T12:16:58.291701+00:00Heroku[web.1]:状态从崩溃更改为>开始2020-06-26T12:17:05.611518+00:00Heroku[web.1]:用命令启动进程>2020-06-26T12:17:08.625648+00:00