jersey 2 multipart pojo始终为null

时间:2015-09-29 11:49:46

标签: java jersey jackson javabeans multipart

我正在尝试使用Jersey + Jackson编写一个休息服务来上传文件以及其他一些文件信息。

使用multipart,文件正确上传,简单字段也可以,但是应该包含其他数据的POJO始终为null。

简化示例

POJO:

public class Test {

 public String name;

 public Test() {}

 public String getName() {
    return name;
 }
 public void setName(String name) {
    this.name = name;
 }
}

应用:

@ApplicationPath("myapp")

public class JerseyApp extends ResourceConfig {

 public JerseyApp() {

  register(MultiPartFeature.class);

  register(JacksonFeature.class);

  packages("com.test.rest");

  // Enable Tracing support.
  property(ServerProperties.TRACING, "ALL");
 }
}

服务:

@Path("file")
public class FileRestService {

 @POST
 @Path("/upload1")
 @Consumes(MediaType.MULTIPART_FORM_DATA)
 public Response createFile1(@FormDataParam("doc") Test doc) {
    //doc is always null
    return Response.ok(doc.getName()).build();
 }

 @POST
 @Path("/upload2")
 @Consumes(MediaType.APPLICATION_JSON)
 public Response createFile2(Test doc) {
    //doc is created ok
    return Response.ok(doc.getName()).build();
 }

web.xml为空

的pom.xml

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.22</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>          
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.22</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.22</version>
    </dependency>       
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.6.2</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.22</version>
    </dependency>       
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>org.fusesource.jansi</groupId>
        <artifactId>jansi</artifactId>
        <version>1.11</version>
    </dependency>
</dependencies>

数据是JSON,我正在使用DHC / Postman进行测试,如果它有任何区别的话。

知道为什么在使用multipart时,pojo / bean是null?

1 个答案:

答案 0 :(得分:5)

查看相关问题here。问题是没有为Content-Type部分设置doc。在那篇文章中(答案)我不知道如何在Postman中设置它,我仍然没有找到解决方案。

如果您使用像cURL这样的工具(我只是说它是REST开发的最佳工具:-),您可以设置每个部分的Content-Type。如果您不知道cURL是一个类似于工具的命令,您可以使用它来发出HTTP(和其他协议)请求。例如,您可以执行类似

的操作
curl -v -X POST http://localhost:8080/api/file \
        -F 'doc={"hello":"world"};type=application/json'

这会将POST请求设置为multipart,并将doc部分设置为application/json类型。

您还会找到一些设置here

的有用示例

更新

另一种选择,如果您根本无法设置各个部分&#39; Content-Type,是在deserialing之前以编程方式设置类型。例如

 @POST
 @Path("/upload1")
 @Consumes(MediaType.MULTIPART_FORM_DATA)
 public Response createFile1(@FormDataParam("doc") FormDataBodyPart part) {
    part.setMediaType(MediaType.APPLICATION_JSON_TYPE);
    Test doc = part.getValueAs(Test.class);
    return Response.ok(doc.getName()).build();
 }