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吗?
在此查看相关问题.问题是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
.
您还可以在此处找到一些有用的设置示例
如果您根本无法设置单个部件,则另一个选项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)
归档时间: |
|
查看次数: |
1564 次 |
最近记录: |