MessageBodyProviderNotFoundException,ModelValidationException

来源:互联网 发布:网站编程常见单词 编辑:程序博客网 时间:2024/09/21 08:18

在使用dropwizard开发文件上传服务的时候,需要使用Jersy的扩展包:

    <dependency>        <groupId>org.glassfish.jersey.media</groupId>        <artifactId>jersey-media-multipart</artifactId>        <version>${multipart.version}</version>    </dependency>

在Resource中使用@FormDataParam

  @Consumes(MediaType.MULTIPART_FORM_DATA)    @POST    public Response upload(            @FormDataParam("name") String name,            @FormDataParam("file") InputStream inputStream    )

在Application中注册Multipart的Provider:

@Override    public void run(final FileConfiguration configuration,                    final Environment environment) {        environment.jersey().register(MultiPartFeature.class);        environment.jersey().register(new MyResource());    }

否则会报异常:

org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response me.ligen.file.resources.FileResource.upload(java.lang.String,java.io.InputStream) throws java.lang.Exception at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, 

接下来要说的是重点,有单元测试习惯的同学,一定会使用Dropwizard提供的ResourceTestRule,那么极有会碰到这个异常:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=multipart/form-data, type=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=class org.glassfish.jersey.media.multipart.FormDataMultiPart

原因是客户端也需要注册MultiPartFeature,否则无法找到对应的Provider。解决办法如下:

@ClassRule    public static final ResourceTestRule RESOURCE_TEST_RULE = ResourceTestRule.builder()            .setClientConfigurator(clientConfig -> clientConfig.register(MultiPartFeature.class))            .addProvider(MultiPartFeature.class)            .addResource(new MyResource())            .build();

这样就能美美得UT了。

原创粉丝点击