Как вернуть пользовательский объект с полем байтового массива с помощью MockServer?

Я использую MockServer

<dependency>
  <groupId>org.mock-server</groupId>
   <artifactId>mockserver-netty</artifactId>
   <version>5.10.0</version>
 </dependency>

Я хочу вернуть настраиваемый объект, содержащий много полей

@AllArgsConstructor(staticName = "of")
static class WcRetrievalResponse implements Serializable {
    
    private final Correspondence correspondence;
    
    @AllArgsConstructor(staticName = "of")
    static class Correspondence implements Serializable{
        
        private final String correspondenceId;
        
        private final String correspondenceFileName;
        
        private final byte[] correspondenceContent;
        
    }        
}

Поле correspondenceContent это байтовый массив (файл получен из ресурса)

Это макет

 final byte[] successResponse = IOUtils.resourceToByteArray("/mock-file.pdf");
    
    WcRetrievalResponse response = WcRetrievalResponse.of(WcRetrievalResponse.Correspondence.of("AN_APP_ID", "Mock-file.pdf", successResponse));
    
    new MockServerClient("localhost", 8080)
            .when(
                    request()
                            .withPath(path)
                            .withMethod("GET")
            )
            .respond(
                    response()
                            .withStatusCode(HttpStatusCode.OK_200.code())
                            .withReasonPhrase(HttpStatusCode.OK_200.reasonPhrase())

                            .withBody(SerializationUtils.serialize(response)));
    

Однако мой restTemplate получил:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class pnc.aop.core.basicsign.boot.wc.impl.WcRetrievalResponse] and content type [application/octet-stream]] with root cause

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class pnc.aop.core.basicsign.boot.wc.impl.WcRetrievalResponse] and content type [application/octet-stream]
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:123)

Это остальные

public byte[] retrieve(String wcId) {
        final HttpHeaders headers = new HttpHeaders();
        headers.set("serviceId", this.wcServiceProperties.getServiceId());
        headers.set("servicePassword", this.wcServiceProperties.getServicePassword());
        final HttpEntity<?> entity = new HttpEntity<>(headers);
        final ResponseEntity<WcRetrievalResponse> response =
                this.restOperations.exchange(URI.create(this.wcServiceProperties.getRetrievalUrl() + wcId), HttpMethod.GET, entity, WcRetrievalResponse.class);
        if (response.getBody() == null ||
            response.getBody() .getCorrespondence() == null ||
            response.getBody() .getCorrespondence().getCorrespondenceContent() == null) {
            throw new IllegalStateException("Not acceptable response from WC service: " + response);
        }
        return response.getBody().getCorrespondence().getCorrespondenceContent();
    }

В чем проблема??

1 ответ

Решение

Вы не должны использовать файл pdf напрямую и помещать его в объект для ответа в виде байтового массива, потому что макет сервера добавит application/octet-streamкак тип контента. Вы должны прочитать файл как строку со структурой, которая будет возвращать экземпляр создания объекта вручную

попробуй это:

final String rString = IOUtils.resourceToString("/your-file.json", StandardCharsets.UTF_8);
        
        new MockServerClient("localhost", 8080)
                .when(
                        request()
                                .withPath(path)
                                .withMethod("GET")
                )
                .respond(
                        response()
                                .withStatusCode(HttpStatusCode.OK_200.code())
                                .withReasonPhrase(HttpStatusCode.OK_200.reasonPhrase())
                                .withContentType(MediaType.APPLICATION_JSON)
                                .withBody(rString));

и файл должен быть таким

{
  "correspondence": {
    "correspondenceId": "I am a mock file!",
    "correspondenceFileName": "mock-name.pdf",
    "correspondenceContent": "YXBwbGljYXRpb24taWQ="
  }
}
    
Другие вопросы по тегам