使用Java+;STS回归“;内容类型';应用程序/八位字节流';“不支持”;

使用Java+;STS回归“;内容类型';应用程序/八位字节流';“不支持”;,java,spring,rest,api-design,Java,Spring,Rest,Api Design,我正在处理一个API的一部分,它需要调用另一个外部API来检索它的一个函数的数据。调用返回HTTP 500错误,描述为“不支持内容类型”application/octet stream。“调用应返回“application/json”类型。” 我发现这是因为接收到的响应没有在其头中显式指定内容类型,即使其内容的格式为JSON,所以我的API默认假定它是一个八位字节流 问题是,我不知道如何对此进行调整。即使另一个API没有指定内容类型,我如何让我的API将从另一个API接收的数据视为应用程序/js

我正在处理一个API的一部分,它需要调用另一个外部API来检索它的一个函数的数据。调用返回HTTP 500错误,描述为“不支持内容类型”application/octet stream。“调用应返回“application/json”类型。”

我发现这是因为接收到的响应没有在其头中显式指定内容类型,即使其内容的格式为JSON,所以我的API默认假定它是一个八位字节流

问题是,我不知道如何对此进行调整。即使另一个API没有指定内容类型,我如何让我的API将从另一个API接收的数据视为应用程序/json?将另一个API更改为在其响应中包含contenttype属性是不可行的

代码:
API类:

@RestController
@RequestMapping(path={Constants.API_DISPATCH_PROFILE_CONTEXT_PATH},produces = {MediaType.APPLICATION_JSON_VALUE})
public class GetProfileApi {

    @Autowired
    private GetProfile GetProfile;

    @GetMapping(path = {"/{id}"})
    public Mono<GetProfileResponse> getProfile(@Valid @PathVariable String id){
        return GetProfile.getDispatchProfile(id);

    }
@RestController
@RequestMapping(路径={Constants.API\u DISPATCH\u PROFILE\u CONTEXT\u path},生成={MediaType.APPLICATION\u JSON\u VALUE})
公共类GetProfileApi{
@自动连线
私有GetProfile GetProfile;
@GetMapping(路径={/{id}})
公共Mono getProfile(@Valid@PathVariable字符串id){
返回GetProfile.getDispatchProfile(id);
}
调用外部API的服务:

@Autowired
private RestClient restClient;

@Value("${dispatch.api.get_profile}")
private String getDispatchProfileUrl;

@Override
public  Mono<GetProfileResponse> getDispatchProfile(String id) {

    return Mono.just(id)
                .flatMap(aLong -> {
    MultiValueMap<String, String> headers = new HttpHeaders();
    headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
    return restClient.get(getDispatchProfileUrl, headers);
                }).flatMap(clientResponse -> {
                    HttpStatus status = clientResponse.statusCode();
                    log.info("HTTP Status : {}", status.value());
                    return clientResponse.bodyToMono(GetProfileClientResponse.class);
                    // the code does not get past the above line before returning the error
                }).map(GetProfileClientResponse -> {
                    log.debug("Response : {}",GetProfileClientResponse);
                    String id = GetProfileClientResponse.getId();

                    log.info("SubscriberResponse Code : {}",id);
                    return GetProfileResponse.builder()
                            // builder call to be completed later
                            .build();
        }); 
}
@Autowired
私人客户;
@值(${dispatch.api.get\u profile}”)
私有字符串getDispatchProfileUrl;
@凌驾
公共Mono getDispatchProfile(字符串id){
返回Mono.just(id)
.flatMap(沿->{
多值映射头=新的HttpHeaders();
headers.add(HttpHeaders.CONTENT\u TYPE、MediaType.APPLICATION\u JSON\u VALUE);
返回restClient.get(getDispatchProfileUrl,headers);
}).flatMap(客户端响应->{
HttpStatus status=clientResponse.statusCode();
log.info(“HTTP状态:{}”,Status.value());
返回clientResponse.bodytomino(GetProfileClientResponse.class);
//在返回错误之前,代码没有通过上述行
}).map(GetProfileClientResponse->{
debug(“响应:{}”,GetProfileClientResponse);
字符串id=GetProfileClientResponse.getId();
log.info(“订阅响应代码:{}”,id);
返回GetProfileResponse.builder()
//稍后将完成生成器调用
.build();
}); 
}
RestClient的GET方法:

public <T> Mono<ClientResponse> get(String baseURL, MultiValueMap<String,String> headers){
    log.info("Executing REST GET method for URL : {}",baseURL);

    WebClient client = WebClient.builder()
            .baseUrl(baseURL)
            .defaultHeaders(httpHeaders -> httpHeaders.addAll(headers))
            .build();
    return client.get()
            .exchange();

}
公共Mono-get(字符串baseURL、多值映射头){ info(“执行URL:{}的REST GET方法”,baseURL); WebClient client=WebClient.builder() .baseUrl(baseUrl) .defaultHeaders(httpHeaders->httpHeaders.addAll(headers)) .build(); 返回client.get() .exchange(); } 我尝试的一个解决方案是将API的
@RequestMapping
中的
products={MediaType.APPLICATION\u JSON\u VALUE}
设置为
products={MediaType.APPLICATION\u OCTET\u STREAM\u VALUE}
,但这导致了另一个错误,HTTP 406不可接受。我发现服务器无法将请求的表示形式中的数据提供给客户端,但我不知道如何更正它

即使响应没有内容类型,我如何才能成功地将其作为JSON处理


希望我的问题框架设计得足够好,我有点被推到这一步,我仍在试图弄清楚到底发生了什么。

你是在使用jackson库还是jaxb库进行编组/解编


尝试使用@XmlRootElement注释Mono实体类,看看会发生什么。

我相信它使用的是Jackson。使用
@XmlRootElement
注释并没有解析为类型,因此它似乎不在项目依赖项中。