代码之家  ›  专栏  ›  技术社区  ›  Rohan

Jersey多部分表单数据默认值?

  •  4
  • Rohan  · 技术社区  · 7 年前

    file 表单数据参数,由显示

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

    我希望有时能够在不提供表单数据参数的情况下访问该端点 ,但现在,当我忽略它时,该方法立即返回400个错误请求。有没有一种方法可以设置它,这样我就可以忽略它?或者有没有什么方法可以为其设置默认值(即设置为null?)。任何帮助都将不胜感激。我的方法声明如下:

    @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
    }
    

    最后,我想创建一个端点,用户可以在其中将文本发布到数据库,并可以选择包括图像或某种类型的媒体。如果有其他方法可以实现这一点,请告诉我。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Paul Samsotha    7 年前

    这并不漂亮,但我能想到的唯一一件事(如果你不想发布任何帖子),就是使用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));
        }
    }