- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个像这样的 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/
我有一个接受CommonsMultipartFile并将其上传到服务器的服务方法 class ExampleService() { def saveFile(CommonsMultipartF
我正在尝试开发一个应用程序,用户将从屏幕上传文件,该文件将在服务器端进行处理。我正在使用 Adobe Flex 的 UI,Spring 3.2 作为中间件和 Java 5。我可以成功上传文件并在服
我正在为我的应用程序创建 API。在基于 GUI 浏览器的应用程序中,文件通过表单提交上传。所以我只是执行 CommonsMultipartFile file = request.getFile(my
大家, 我正在使用 Grails 中的 spock 测试某些需要 CommonMultipartFile 作为输入参数的方法。 我的问题是如何创建这些文件,以便不生成本地文件。其中一些必须使用 req
我正在尝试使用 JPA 将上传的文件保存到数据库。 (对我来说)最“自然”的方式是将域对象定义为: @Entity class UploadFile { ... public CommonsM
我有一个将 CommonsMultipartFile 对象作为参数的 junit 测试方法。 我正在尝试创建一个 FileItem 对象,以便将其传递给构造函数, CommonsMultipartFi
我的 Spring Boot 应用程序中有以下部分代码: base64str 变量具有编码 Base 64 图像, byte[] data = Base64.decode(base64str); 但我
我正在尝试使用 MultipartFile 发出 POST 请求。首先,我想将文件转换为 MultipartFile: File file = new File(filePath); DiskFile
我有一个像这样的 CommonsMultipartFile 类型字段的 bean: public class Placement implements Serializable { private s
我无法读取我在 Grails 中上传的文件。 write 是数据库中我存储上传文件的列。 CommonsMultipartFile testFile = request.getFile('templa
我正在尝试使用一个在请求中接受 CommonsMultipartFile 的 Web 服务。因此,我使用 Spring 的 RestTemplate 创建了一个 HTTP 客户端。下面的方法接受 UR
我正在尝试使用推土机从 CommonsMultipartFile 映射到 byte[]。 我知道我需要一个 customConverter 因为 dozer 对 CommonsMultipartFil
我正在使用 Spring-MVC 3.0,在我的应用程序中,我发送了一些带有多个附件的信息,每个文件都有标题、Id 等。所以,我制作了一个 DTO,如下所示 public class MyDTO {
我有一个表单对象,它由 Spring 自动正确填充。在这个表单对象中,我有一个字段: CommonsMultipartFile file; 用户可以上传文件,并且表单对象正确包含该文件。一切都很好。但
在我的公司,出于额外原因,我需要将 MIME 类型与文件扩展名进行比较。我有一个 CommonsMultipartFile。我试图找出进行这种比较的最佳方法。我看到了 MimetypesFileTyp
我正在尝试使用 javascript 的 XMLHttpRequest 对象上传图像,但 Spring 一直抛出 NoSuchMethodException。异常情况如下: java.lang.NoS
我正在使用 spring 3.0 org.springframework.web.multipart.commons.CommonsMultipartFile 进行文件上传。我想写下使用 Mockit
我不知道该怎么做附件。已安装插件“邮件”,相关文件是从表单上载(成功)的.csv文件。 这有效: def f = request.getFile('uploadedFile') //do a bunc
我正在一个屏幕上工作,它将文件作为 BFILE 类型上传到 oracle 表。我正在使用 spring3 和 hibernate3。 BO 类如下所示: @Entity @Table(name="ab
它有效: 查看(普惠制): Controller : def destination = "D:\\someFolder\\image.jpg"; def f = reques
我是一名优秀的程序员,十分优秀!