在使用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了。