球衣 2 多部分 pojo 始终为空
jersey 2 multipart pojo is always null
我正在尝试使用 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 为空吗?
参见相关问题here。问题是 Content-Type
没有为 doc
部分设置。那个post(answer)不知道怎么在Postman里设置,一直没找到解决方法
如果您使用像 cURL 这样的工具(我只想说它是有史以来最好的 REST 开发工具 :-),您可以设置每个部分的 Content-Type
。如果您还不知道 cURL 是一种类似命令的工具,您可以使用它来发出 HTTP(和其他协议)请求。例如,您可以执行类似
curl -v -X POST http://localhost:8080/api/file \
-F 'doc={"hello":"world"};type=application/json'
这使得 POST 请求作为多部分并将 doc
部分设置为 application/json
.
类型
您还将找到一些设置 here
的有用示例
更新
另一个选项,如果您根本无法设置各个部分'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();
}
我正在尝试使用 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 为空吗?
参见相关问题here。问题是 Content-Type
没有为 doc
部分设置。那个post(answer)不知道怎么在Postman里设置,一直没找到解决方法
如果您使用像 cURL 这样的工具(我只想说它是有史以来最好的 REST 开发工具 :-),您可以设置每个部分的 Content-Type
。如果您还不知道 cURL 是一种类似命令的工具,您可以使用它来发出 HTTP(和其他协议)请求。例如,您可以执行类似
curl -v -X POST http://localhost:8080/api/file \
-F 'doc={"hello":"world"};type=application/json'
这使得 POST 请求作为多部分并将 doc
部分设置为 application/json
.
您还将找到一些设置 here
的有用示例更新
另一个选项,如果您根本无法设置各个部分'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();
}