java CommonsMultipartFile 的 Jackson 序列化问题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6794883/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 17:18:05  来源:igfitidea点击:

Hymanson Serialization issue with CommonsMultipartFile

javajsonserializationHymanson

提问by Ankush

I have a bean with CommonsMultipartFile type field like so:

我有一个带有 CommonsMultipartFile 类型字段的 bean,如下所示:

public class Placement implements Serializable {

private static final long serialVersionUID = 1L;

private long placementId;
private String type;
private String placement;
private transient CommonsMultipartFile fileData;

I have marked CommonsMultipartFile field as transient and trying to serialize to json using Hymanson library. But getting following error:

我已将 CommonsMultipartFile 字段标记为瞬态并尝试使用 Hymanson 库序列化为 json。但收到以下错误:

org.codehaus.Hymanson.map.JsonMappingException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: nextag.travel.dashboard.model.Placement["fileData"]->org.springframework.web.multipart.commons.CommonsMultipartFile["inputStream"])

Any help/ suggestions would be highly appreciated.

任何帮助/建议将不胜感激。

回答by Programmer Bruce

It's not clear how Hymanson is being used, as no code or description was provided in the original question.

不清楚如何使用 Hymanson,因为原始问题中没有提供代码或描述。

By default, Hymanson skips all transient fields during serialization.

默认情况下,Hymanson 在序列化期间跳过所有临时字段。

import java.io.Serializable;

import org.codehaus.Hymanson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.Hymanson.map.ObjectMapper;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
    System.out.println(mapper.writeValueAsString(new Placement()));
    // output:  {"placementId":42,"type":"OK","placement":"left"}
    // transient fields are skipped by default
  }
}

class Placement implements Serializable
{
  private static final long serialVersionUID = 1L;

  private long placementId = 42;
  private String type = "OK";
  private String placement = "left";
  private transient CommonsMultipartFile fileData = new CommonsMultipartFile();
}

class CommonsMultipartFile
{
  private String name = "Fred";
}

If there is a getter for the transient field, however, then by default Hymanson includes it during serialization.

但是,如果瞬态字段有一个 getter,那么默认情况下,Hymanson 在序列化过程中会包含它。

import java.io.Serializable;

import org.codehaus.Hymanson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.Hymanson.map.ObjectMapper;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
    System.out.println(mapper.writeValueAsString(new Placement()));
    // output: {"placementId":42,"type":"OK","placement":"left","fileData":{"name":"Fred"}}
    // transient fields with getters are not skipped by default
  }
}

class Placement implements Serializable
{
  private static final long serialVersionUID = 1L;

  private long placementId = 42;
  private String type = "OK";
  private String placement = "left";
  private transient CommonsMultipartFile fileData = new CommonsMultipartFile();

  public CommonsMultipartFile getFileData() {return fileData;}
}

class CommonsMultipartFile
{
  private String name = "Fred";
}

One configuration option to skip the getter is to just apply the @JsonIgnore annotation.

跳过 getter 的一种配置选项是仅应用 @JsonIgnore 注释。

import java.io.Serializable;

import org.codehaus.Hymanson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.Hymanson.annotate.JsonIgnore;
import org.codehaus.Hymanson.map.ObjectMapper;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
    System.out.println(mapper.writeValueAsString(new Placement()));
    // output: {"placementId":42,"type":"OK","placement":"left"}
    // getters marked with @JsonIgnore are ignored
  }
}

class Placement implements Serializable
{
  private static final long serialVersionUID = 1L;

  private long placementId = 42;
  private String type = "OK";
  private String placement = "left";
  private transient CommonsMultipartFile fileData = new CommonsMultipartFile();

  @JsonIgnore
  public CommonsMultipartFile getFileData() {return fileData;}
}

class CommonsMultipartFile
{
  private String name = "Fred";
}

If it's not possible or desirable to edit the original class definition to add the @JsonIgnore annotation, a Mix-Incan be used.

如果不可能或不希望编辑原始类定义以添加 @JsonIgnore 注释,则可以使用Mix-In

import java.io.Serializable;

import org.codehaus.Hymanson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.Hymanson.annotate.JsonIgnore;
import org.codehaus.Hymanson.map.ObjectMapper;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
    mapper.getSerializationConfig().addMixInAnnotations(Placement.class, SkipFileDataMixIn.class);
    System.out.println(mapper.writeValueAsString(new Placement()));
    // output: {"placementId":42,"type":"OK","placement":"left"}
    // getters marked with @JsonIgnore are ignored
  }
}

abstract class SkipFileDataMixIn
{
  @JsonIgnore
  public abstract CommonsMultipartFile getFileData();
}

class Placement implements Serializable
{
  private static final long serialVersionUID = 1L;

  private long placementId = 42;
  private String type = "OK";
  private String placement = "left";
  private transient CommonsMultipartFile fileData = new CommonsMultipartFile();

  public CommonsMultipartFile getFileData() {return fileData;}
}

class CommonsMultipartFile
{
  private String name = "Fred";
}

Another approach is to mark the type to be skipped with @JsonIgnoreType.

另一种方法是用 标记要跳过的类型@JsonIgnoreType

import java.io.Serializable;

import org.codehaus.Hymanson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.Hymanson.annotate.JsonIgnoreType;
import org.codehaus.Hymanson.map.ObjectMapper;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
    System.out.println(mapper.writeValueAsString(new Placement()));
    // output: {"placementId":42,"type":"OK","placement":"left"}
    // Types marked with @JsonIgnoreType are ignored during serialization.
  }
}

class Placement implements Serializable
{
  private static final long serialVersionUID = 1L;

  private long placementId = 42;
  private String type = "OK";
  private String placement = "left";
  private transient CommonsMultipartFile fileData = new CommonsMultipartFile();

  public CommonsMultipartFile getFileData() {return fileData;}
}

@JsonIgnoreType
class CommonsMultipartFile
{
  private String name = "Fred";
}

回答by Arun P Johny

If you do not want to serialize the multipartfile then add the annotation @JsonIgnoreto the field.

如果您不想序列化多部分文件,则将注释添加@JsonIgnore到该字段。

@JsonIgnore
private CommonsMultipartFile fileData;

You can read more abot Hymanson annotations here.

您可以在此处阅读更多 abot Hymanson 注释。