gpt4 book ai didi

java - CommonsMultipartFile 的 Jackson 序列化问题

转载 作者:搜寻专家 更新时间:2023-11-01 01:37:59 24 4
gpt4 key购买 nike

我有一个像这样的 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;

我已将 CommonsMultipartFile 字段标记为 transient ,并尝试使用 jackson 库序列化为 json。但是出现以下错误:

org.codehaus.jackson.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"])

如有任何帮助/建议,我们将不胜感激。

最佳答案

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

默认情况下,Jackson 在序列化期间跳过所有 transient 字段。

import java.io.Serializable;

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.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";
}

但是,如果 transient 字段有一个 getter,那么默认情况下 Jackson 在序列化期间包含它。

import java.io.Serializable;

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.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";
}

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

import java.io.Serializable;

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.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";
}

如果不可能或不需要编辑原始类定义来添加@JsonIgnore 注释,一个Mix-In可以使用。

import java.io.Serializable;

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.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";
}

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

import java.io.Serializable;

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonIgnoreType;
import org.codehaus.jackson.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";
}

关于java - CommonsMultipartFile 的 Jackson 序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com