簡體   English   中英

球衣 2 多部分 pojo 始終為空

[英]jersey 2 multipart pojo is always null

我正在嘗試編寫一個休息服務來上傳一個文件以及其他一些文件信息,使用 Jersey + Jackson。

使用 multipart,文件被正確上傳,簡單的字段也可以,但是應該包含附加數據的 POJO 始終為空。

簡化示例

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 為空嗎?

請參閱此處的相關問題。 問題是沒有為doc部分設置Content-Type 在那個帖子(答案)中,我不知道如何在 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類型。

您還將在此處找到一些有用的設置示例


更新

如果您根本無法設置單個部件的Content-Type ,另一種選擇是在反序列化之前以編程方式設置類型。 例如

 @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();
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM