Java 可以使用JSON和多部分表单的REST服务
我需要在SpringMVC中创建一个可以处理JSON和多部分表单请求的方法 这是我的方法的签名:Java 可以使用JSON和多部分表单的REST服务,java,json,rest,spring-mvc,Java,Json,Rest,Spring Mvc,我需要在SpringMVC中创建一个可以处理JSON和多部分表单请求的方法 这是我的方法的签名: @RequestMapping(value = { "/upload_image" }, method = RequestMethod.POST) public @ResponseBody void uploadImage(final ImageDTO image) ImageDTO类如下所示: public class ImageDTO { private String imageUrl;
@RequestMapping(value = { "/upload_image" }, method = RequestMethod.POST)
public @ResponseBody void uploadImage(final ImageDTO image)
ImageDTO类如下所示:
public class ImageDTO {
private String imageUrl;
private Long imageId;
private MultipartFile image;
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(final String url) {
this.imageUrl = url;
}
public Long getImageId() {
return imageId;
}
public void setImageId(final Long imageId) {
this.imageId = imageId;
}
public MultipartFile getImage() {
return image;
}
public void setImage(MultipartFile image) {
this.image = image;
}
}
所以这个场景是我需要支持两个场景:
1.从表单向上加载图像,其中内容类型为多部分表单(所有DTO成员均不为null)
2.使用JSON上传图像,仅使用imageUrl。
在本例中,请求主体如下所示:
{
"imageId":"1236",
"imageUrl":"http://some.image.url",
"image":null
}
当前的实现可以很好地处理多部分请求,但在发送JSON时,ImageDTO对象的所有成员中都包含null
是否可以使同一方法处理这两种内容类型
谢谢。要接收JSON,您需要使用
@RequestBody
@RequestMapping(value = { "/upload_image" }, method = RequestMethod.POST)
public @ResponseBody void uploadImage(final @RequestBody ImageDTO image)
我曾经遇到过类似的情况,下面是我的想法。这两种方法都不是很干净,但都非常有效。您需要从客户端发送一个多部分请求: 注意:保存文件的变量的数据类型是
InputStream
。你需要相应地改变它
// imports
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
// code flow
// HttpServletRequest request
final FileItemFactory factory = new DiskFileItemFactory();
final ServletFileUpload fileUpload = new ServletFileUpload(factory);
List items = null;
private Map<String, InputStream> fileMap = new HashMap<String, InputStream>();
if (ServletFileUpload.isMultipartContent(request)) {
// get the request content and iterate through
items = fileUpload.parseRequest(request);
if (items != null) {
final Iterator iter = items.iterator();
while (iter.hasNext()) {
final FileItem item = (FileItem) iter.next();
final String fieldName = item.getFieldName();
final String fieldValue = item.getString();
// this is for non-file fields
if (item.isFormField()) {
switch (fieldName) {
case "imageId" :
// set inside your DTO field
break;
// do it for other fields
}
} else {
// set the image in DTO field
}
}
}
}
在引入@modeldattribute注释之前,我在所有DTO成员中都有相同的结果-null。现在一切正常,下面是工作代码: 控制器方法:
@RequestMapping(value=“/save”,method=RequestMethod.POST,
使用={“多部分/表单数据”})
public void create(@Valid@modeldattribute(“entryForm”)final EntryDTO EntryDTO,
final BindingResult validationResult)抛出FormValidationError{
验证(entryDTO,validationResult);
entryService.save(entryDTO);
}
DTO:
公共类入口到{
私有字符串短语;
私有字符串翻译;
私有多部分文件;
}
表格:
词组
翻译
注意,表单名为“entryForm”,相应的@ModelAttribute(“entryForm”)。谢谢。我已经试过了,这确实让JSON工作了,但是当发送多部分表单请求时失败了,错误表明不支持多部分表单内容类型。是的,您不能直接这样做。我明白了。非常感谢。这看起来像是Jax-Rs而不是Spring-MVCIf。我理解正确,这将要求请求的内容类型始终为“multipart-form”。我想知道是否有可能使该方法既能处理多部分表单,又能处理请求中的json。是的,这将需要多部分表单请求。无法在JSON请求中发送文件内容。
@Path("/upload")
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public ResponseDTO upload(FormDataMultiPart multiPartData) {
// non-file fields
final String imageId = multiPartData.getField("imageId").getValue();
// for file field
final FormDataBodyPart imagePart = multiPartData.getField("image");
final ContentDisposition imageDetails= imagePart.getContentDisposition();
final InputStream imageDoc = imagePart.getValueAs(InputStream.class);
// set the retrieved content in DTO
}