2017-09-01 68 views
2

我有一个接受类型多部分表单数据的方法。其中一个参数,这个方法是一个file表单数据PARAM,但不提供表单数据PARAM file通过泽西岛多部分表格数据默认值?

@FormDataParam("file") InputStream inputStream, 
@FormDataParam("file") FormDataContentDisposition contentDispositionHeader 

我希望能够有时打这个端点所示,但现在,当我离开它的方法立即返回400错误的请求。有没有办法可以设置它,以便我可以放弃它?或者有什么方法可以为此设置一个默认值(即为空?)。任何帮助,将不胜感激。我的方法声明如下:

@POST 
@Path("/publish") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response publish(@Auth Key key, 
         @QueryParam("email") String email, 
         @HeaderParam("password") String password, 
         @QueryParam("type") PublishType type, 
         @QueryParam("message") String message, 
         @FormDataParam("file") InputStream inputStream, 
         @FormDataParam("file") FormDataContentDisposition 
           contentDispositionHeader, 
         @FormDataParam("title") @DefaultValue("") String videoTitle) { 
    // code here 
} 

最后,我想创建一个端点,其中用户可以发布文本到一个数据库,并可选包括图像或某些类型的媒体。让我知道,如果有另一种方式,我可以做到这一点。

谢谢!

+0

[I不能再现的问题](https://gist.github.com/psamsotha/eb30d0e659a2cb6c09dbcd0d712417ee)。你使用什么泽西版本? –

+0

@peeskillet我相信我正在使用版本2.23.2。但我认为你的例子中的差异可能是你仍然在请求中发布表单数据。与我的,当我尝试击中没有表单数据的端点时,只有查询参数和头部参数,它返回400. – Rohan

+0

如果它是电子邮件和其他东西作为查询参数没有太大意义一个帖子。你为什么不把它们添加为表单域。这是多部分意味着什么。 –

回答

2

这不是很漂亮,但我能想到的唯一一件事(如果你不想发布任何内容),就是使用Jersey的ContainerRequest,你可以注入方法中。然后,如果有任何物体,请将多部分作为FormDataMultiPart并手动移动零件。

@POST 
@Produces(MediaType.TEXT_PLAIN) 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public String post(@Context ContainerRequest request) { 
    final String contentLength = request.getHeaderString(HttpHeaders.CONTENT_LENGTH); 
    if (contentLength != null && Integer.parseInt(contentLength) != 0) { 
     FormDataMultiPart multiPart = request.readEntity(FormDataMultiPart.class); 
     FormDataBodyPart part = multiPart.getField("test"); 
     String result = part.getValueAs(String.class); 
     return result; 
    } 
    return "no body"; 
} 

下面是一个完整的测试

import org.glassfish.jersey.client.ClientConfig; 
import org.glassfish.jersey.filter.LoggingFilter; 
import org.glassfish.jersey.media.multipart.*; 
import org.glassfish.jersey.server.ContainerRequest; 
import org.glassfish.jersey.server.ResourceConfig; 
import org.glassfish.jersey.test.JerseyTest; 
import org.junit.Test; 

import javax.ws.rs.*; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.HttpHeaders; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 
import java.util.logging.Logger; 

import static org.junit.Assert.assertEquals; 

/** 
* Example with default value for multipart field. 
* 
* Dependencies for JUnit test. 
* 
* <dependency> 
*  <groupId>org.glassfish.jersey.test-framework.providers</groupId> 
*  <artifactId>jersey-test-framework-provider-grizzly2</artifactId> 
*  <scope>test</scope> 
*  <version>${jersey2.version}</version> 
* </dependency> 
* <dependency> 
*  <groupId>org.glassfish.jersey.media</groupId> 
*  <artifactId>jersey-media-multipart</artifactId> 
*  <version>${jersey2.version}</version> 
* </dependency> 
*/ 
public class MultiPartMissingTest extends JerseyTest { 

    @Path("test") 
    public static class TestResource { 

     @POST 
     @Produces(MediaType.TEXT_PLAIN) 
     @Consumes(MediaType.MULTIPART_FORM_DATA) 
     public String post(@Context ContainerRequest request) { 
      final String contentLength = request.getHeaderString(HttpHeaders.CONTENT_LENGTH); 
      if (contentLength != null && Integer.parseInt(contentLength) != 0) { 
       FormDataMultiPart multiPart = request.readEntity(FormDataMultiPart.class); 
       FormDataBodyPart part = multiPart.getField("test"); 
       String result = part.getValueAs(String.class); 
       return result; 
      } 
      return "no body"; 
     } 
    } 


    @Override 
    public ResourceConfig configure() { 
     return new ResourceConfig() 
       .register(TestResource.class) 
       .register(MultiPartFeature.class) 
       .register(new LoggingFilter(Logger.getAnonymousLogger(), true)) 
       .register(new ExceptionMapper<Throwable>() { 
        @Override 
        public Response toResponse(Throwable t) { 
         t.printStackTrace(); 
         return Response.serverError().entity(t.getMessage()).build(); 
        } 
       }); 
    } 

    @Override 
    public void configureClient(ClientConfig config) { 
     config.register(MultiPartFeature.class); 
    } 

    @Test 
    public void testWithBody() { 
     final MultiPart multiPart = new FormDataMultiPart() 
       .field("test", "testing"); 

     final Response response = target("test") 
       .request() 
       .post(Entity.entity(multiPart, multiPart.getMediaType())); 

     assertEquals(200, response.getStatus()); 
     assertEquals("testing", response.readEntity(String.class)); 
    } 

    @Test 
    public void withoutBody() { 
     final Response response = target("test") 
       .request() 
       .post(null); 

     assertEquals(200, response.getStatus()); 
     assertEquals("no body", response.readEntity(String.class)); 
    } 
} 
+0

这回答我的问题,但是你说得对,它不是很漂亮!在这一点上,我可能不得不重新考虑我的设计。不过谢谢,这是非常丰富的。 – Rohan