【问题标题】:.getBody() method doesn't return response - SpringBoot, Java.getBody() 方法不返回响应 - SpringBoot,Java
【发布时间】:2021-08-18 06:01:17
【问题描述】:

HttpDataClient.java 类正在向外部服务发送dataId,应该会收到一些响应。对于我的测试,我应该测试 RestTemplate 并检查我是否得到了良好的响应。

public class HttpDataClient implements DataClient{
    
        private final static Logger LOGGER = LoggerFactory.getLogger(HttpDataClient.class);
    
        private final RestTemplate restTemplate;
        private final ObjectMapper objectMapper = new ObjectMapper();
    
        public HttpDataClient(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }
    
        @Override
        public DataResponse getData(String dataId) {
            try{
                JsonNode node = restTemplate.exchange(
                        String.format("/data/{0}", dataId),
                        HttpMethod.POST,
                        new HttpEntity<>(buildRequest(dataId), headers()),
                        JsonNode.class
                ).getBody();
                return dataResponse(node);
            }catch (HttpStatusCodeException e) {
                String msg = String.format(
                        "Error getting data for dataId: {0}",
                        dataId,
                        e.getStatusCode(),
                        e.getResponseBodyAsString());
                LOGGER.error(msg);
                return dataResponse.failed();
            }
        }
    
        private MultiValueMap<String, String> headers() {
            final LinkedMultiValueMap<String, String> mv = new LinkedMultiValueMap<>();
            mv.set(HttpHeaders.CONTENT_TYPE, "application/json");
            return mv;
        }
    
        private DataResponse dataResponse(JsonNode node) {
            return DataResponse.dataResponse(
                    asString(node, "dataId"),
                    asString(node, "author"),
                    asString(node, "authorDataId"),
                    asString(node, "serverSideDataId")
            );
        }
    
        private JsonNode buildRequest(String dataId) {
            ObjectNode root = objectMapper.createObjectNode();
            root.put("dataId", dataId);
            return root;
        }
    }

DataResponse.java

public class DataResponse {

    public final String dataId;
    public final String author;
    public final String authorDataId;
    public final String serverSideDataId;

    public DataResponse(
            String dataId,
            String author,
            String authorDataId,
            String serverSideDataId) {
        notNull(dataId, "dataId must be set");
        notNull(author, "author must be set");
        notNull(authorDataId, "authorDataId must be set");
        notNull(serverSideDataId, "serverSideDataId must be set");
        this.dataId = dataId;
        this.author = author;
        this.authorDataId = authorDataId;
        this.serverSideDataId = serverSideDataId;
    }

    public static GameDataResponse gameDataResponse(
            String gameId,
            String vendor,
            String vendorGameId,
            String serverSideGameId){
        return new GameDataResponse(
                gameId,
                vendor,
                vendorGameId,
                serverSideGameId);
    }

    //TODO PD-849 - add faild method
    public static GameDataResponse failed() {
        return new GameDataResponse(
                failed().gameId,
                failed().vendor,
                failed().vendorGameId,
                failed().serverSideGameId
        );
    }
}

界面:

public interface DataService {

    DataResponse getData(String dataId);
}

这里是测试类:

@RunWith(MockitoJUnitRunner.class)
public class HttpDataServiceTest {

    RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
    private final HttpDataService httpDataService = new HttpDataService(restTemplate);

    @Test
    public void getData(){

        ObjectNode responseNode = JsonNodeFactory.instance.objectNode();
        responseNode.put("dataId", "");
        responseNode.put("author", "");
        responseNode.put("authorDataId", "");
        responseNode.put("serverSideDataId", "");

        Mockito
            .when(restTemplate.exchange(
                    ArgumentMatchers.eq("/data/dataIdTest"),
                    ArgumentMatchers.eq(HttpMethod.POST),
                    ArgumentMatchers.any(),
                    ArgumentMatchers.<Class<JsonNode>>any()))
            .thenReturn(new ResponseEntity<>(responseNode, HttpStatus.OK));

        httpDataService.getData("dataIdTest");


    }
}

所以,当我调试时,我通过测试类并且一切正常,然后它转到 HttpDataClient.java 类到 getData() method and when I am in restTemplate.exchangeI can see thatdataIdis sent, then it goes down to.getBody();` 并且它中断了。而且我没有得到任何回报。

我在这里缺少什么? 任何建议表示赞赏。

【问题讨论】:

  • 对于初学者,String.format 不理解 URI 模板。
  • 不是吗?那我应该从你的意见中说什么?
  • 建议:LOGGER.debug 在调用exchange 之前回复getBody() 就可以了。特别记录状态码。

标签: java spring-boot resttemplate


【解决方案1】:

仅基于快速浏览 - 尝试更改

String.format("/data/{0}", dataId)

String.format("/data/%s", dataId)

在您的 DataResponse getData(String dataId) 方法中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2022-01-11
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多