Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以使用JSON和多部分表单的REST服务_Java_Json_Rest_Spring Mvc - Fatal编程技术网

Java 可以使用JSON和多部分表单的REST服务

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;

我需要在SpringMVC中创建一个可以处理JSON和多部分表单请求的方法

这是我的方法的签名:

@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
    }