jersey 2 multipart pojo始终为null

Mih*_*anu 1 java multipart jersey javabeans jackson

我正在尝试使用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;
 }
}
Run Code Online (Sandbox Code Playgroud)

应用:

@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");
 }
}
Run Code Online (Sandbox Code Playgroud)

服务:

@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();
 }
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

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

Pau*_*tha 5

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

如果你使用像一个工具卷曲(我只想说,是一个休息的发展:-)有史以来最好的工具,你可以设置Content-Type各部分的.如果你不知道cURL是一个类似于工具的命令,你可以使用它来发出HTTP(和其他协议)请求.例如,你可以做类似的事情

curl -v -X POST http://localhost:8080/api/file \
        -F 'doc={"hello":"world"};type=application/json'
Run Code Online (Sandbox Code Playgroud)

这使得POST请求成为多部分并将部件设置doc为类型application/json.

您还可以在此处找到一些有用的设置示例


UPDATE

如果您根本无法设置单个部件,则另一个选项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();
 }
Run Code Online (Sandbox Code Playgroud)