Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dropwizard Dropwizard Apprule测试多部分文件上载_Java_Jersey_Dropwizard - Fatal编程技术网

Java Dropwizard Dropwizard Apprule测试多部分文件上载

Java Dropwizard Dropwizard Apprule测试多部分文件上载,java,jersey,dropwizard,Java,Jersey,Dropwizard,我目前正试图通过调用一个以MultiPartFormData作为输入的资源来编写一个IT测试 它在应用程序“正常”启动时工作,但在使用DropwizardAppRule helper启动时不工作 这是我的密码: @Test public void importProductAndOfferCsvShopInput() { // Given var shopId = "id"; var multipartHeaders = headers; mu

我目前正试图通过调用一个以MultiPartFormData作为输入的资源来编写一个IT测试

它在应用程序“正常”启动时工作,但在使用DropwizardAppRule helper启动时不工作

这是我的密码:

@Test
public void importProductAndOfferCsvShopInput() {
    // Given
    var shopId = "id";
    var multipartHeaders = headers;
    multipartHeaders.putSingle("Content-Type", "multipart/form-data");

    var file = new File("src/test/resources/import/products&offers.csv");
    var fileDataBodyPart = new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE);
    MultiPart multiPart = new FormDataMultiPart().bodyPart(fileDataBodyPart, MediaType.MULTIPART_FORM_DATA_TYPE);

    // When
    var response = QORUS_APP.client().target(String.format("http://localhost:%d/ui/shop-inputs/csv/%s", 8082, shopId))
                            .queryParam("importContentType", "BOTH")
                            .request()
                            .headers(multipartHeaders)
                            .post(Entity.entity(multiPart, multiPart.getMediaType()));

    // Then
    assertThat(response.getStatusInfo()).isEqualTo(Response.Status.OK);
}
QORUS_应用程序的声明如下:

public abstract class AbstractRestResourceTest {

    @ClassRule
    public static final DropwizardAppRule<Configuration> QORUS_APP = ResourceSuite.QORUS_APP;
    private static final String USER_API_KEY = "authenticatedUserApiKey";

    protected static MultivaluedMap<String, Object> headers;

    public AbstractRestResourceTest() {
        headers = new MultivaluedHashMap<>();
        headers.putSingle("Content-Type", "application/json");
        headers.putSingle("Accept", "*/*");
        headers.putSingle(NgTokenAuthFilter.AUTHORIZATION_HEADER, "Bearer " + USER_API_KEY);
    }
}

正如您所建议的。

在客户端发出请求之前,该错误正在客户端发生,它将显示您还需要在客户端注册
MultiPartFeature
。您可以在
客户端
网络目标
中注册它。Dropwizard建议您将其注册到
WebTarget
,如示例所示

var response = QORUS_APP.client()
        .target(...)
        .register(MultiPartFeature.class)
        ...

.bodyPart(fileDataBodyPart,MediaType.MULTIPART\u FORM\u DATA\u TYPE)
此部件的介质类型不应为multpart。您甚至不需要第二个参数,因为您在构建FileDataBodyPartOk时已经设置了媒体类型,我就是这么做的。已删除主体部分的MediaType。你能给我解释一下为什么它不应该是多部分的,以及它是什么吗?感谢您的帮助。multipart是整个实体的媒体类型。它被称为multipart,因为有多个部分,每个部分都是自己的独立实体,有自己独立的内容类型。在本例中,文件的内容类型是application/octet stream,正如您在构建FileDataCodePart时声明的那样。很抱歉,您在构建FileDataCodePart时没有设置媒体类型。但是有三个不同的构造函数,一个允许传递MediaType。您正在使用的javadoc声明:“使用提供的名称和文件构造主体部分,它预测提供的文件的媒体类型。对于已知的媒体类型,客户端不需要显式设置媒体类型。”因此,正如您所看到的,这只是猜测。您可以在尝试时通过调用
bodyPart()
添加它,但在本例中,您将使用类似application/csvOk的东西,我现在非常清楚了。非常感谢你的解释。
@Test
public void importProductAndOfferCsvShopInput() {
    // Given
    var shopId = "5b03ebe9c9aa0423b4a73dce";
    var multipartHeaders = headers;
    multipartHeaders.putSingle("Content-Type", "multipart/form-data");

    var file = new File("src/test/resources/import/products&offers.csv");
    var fileDataBodyPart = new FileDataBodyPart("file", file);
    var multiPart = new FormDataMultiPart().bodyPart(fileDataBodyPart);

    // When
    var response = QORUS_APP.client()
                            .target(String.format("http://localhost:%d/ui/shop-inputs/csv/%s", 8082, shopId))
                            .register(MultiPartFeature.class)
                            .queryParam("importContentType", "BOTH")
                            .request()
                            .headers(multipartHeaders)
                            .post(Entity.entity(multiPart, multiPart.getMediaType()));

    // Then
    assertThat(response.getStatusInfo()).isEqualTo(Response.Status.OK);
}
var response = QORUS_APP.client()
        .target(...)
        .register(MultiPartFeature.class)
        ...