2015-12-10 81 views
0

我试图使用序列杰克逊Java中的对象,但是当我试图序列化,它给了我这个错误序列化对象到JSON:无法使用杰克逊

No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer 

I tried this post, but it didn't help.

这里是我试图序列化类:

public class Repository { 
    public String name; 
    @JsonIgnore // to avoid recursive calls 
    public ArrayList<UserRole> contributors = new ArrayList<UserRole>(); 
    public User self; 
    public ArrayList<FileInfo> files; 
    public RepositoryType repositoryType; 
    public String path; 
} 

我还试图创建getter/setter方法对每个领域,但仍然一无所获。

这里是我的序列化方法:

public static String convertObjectToJson(Object object) throws IOException { 
     ObjectWriter objectWriter = new ObjectMapper().writer().withDefaultPrettyPrinter(); 
     String json = objectWriter.writeValueAsString(object); //error on this line 
     return json; 
    } 
+0

什么是'FileInfo'?你如何期望杰克逊序列化它? –

+0

杰克逊为什么不应该序列化它?当im将对象传递给序列化程序时,files字段为空。 –

回答

1

看起来你对你的一个类有java.io.FileDescriptor参考。

By default, Jackson will only work with with fields that are either public, or have a public getter methods – serializing an entity that has all fields private or package private will fail

如果你看看java.io.FileDescriptor的源代码,你可以see 有没有公众的干将私人领域。

您应该配置您的objectMapper可见性以允许访问私有字段。

// For jackson 2.* 
objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); 

// For jackson lower than 2 
objectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY); 
+0

谢谢,我不使用fileDescriptro,但将ObectWriter更改为ObjectMapper并设置可见性解决了问题。 –

0

我面临的问题将对象发送到Thymeleaf模板,ResponseEntity这是给我的异常“的StackOverflowError”序列化时,你的笔记“@JsonIgnore //避免递归调用”解决我的问题。谢谢

+1

这不提供问题的答案。你可以[搜索类似的问题](// stackoverflow.com/search),或者参考页面右侧的相关和链接问题来找到答案。如果你有一个相关但不同的问题,请[提出一个新问题](// stackoverflow.com/questions/ask),并包含一个链接来帮助提供上下文。请参阅:[提问,获得答案,没有分心](// stackoverflow.com/tour) – sudo