use*_*300 6 java annotations jackson
我正在尝试使用Jackson 2.0 mixins序列化一个没有注释的类.
简化的源代码如下.请注意,我没有使用getter/setter,但似乎我仍然可以根据一些相当粗略的文档使用mixins .
public class NoAnnotation {
private Date created;
private String name;
private int id;
private List<URL> urls = new ArrayList();
// make one with some data in it for the test
static NoAnnotation make() {
NoAnnotation na= new NoAnnotation();
na.created = new Date();
na.name = "FooBear";
na.id = 23456;
try {
na.urls.add(new URL("http://www.eclipse.org/eclipselink/moxy.php"));
na.urls.add(new URL("http://jaxb.java.net"));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
return na;
}
// my Mixin "Class"
static class JacksonMixIn {
JacksonMixIn(@JsonProperty("created") Date created,
@JsonProperty("name") String name,
@JsonProperty("id") int id,
@JsonProperty("urls") List<URL> urls)
{ /* do nothing */ }
}
// test code
public static void main(String[] args) throws Exception {
NoAnnotation na = NoAnnotation.make();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixInAnnotations(NoAnnotation.class, JacksonMixIn.class);
String jsonText = objectMapper.writeValueAsString(na);
System.out.println(jsonText);
}
}
Run Code Online (Sandbox Code Playgroud)
当我跑主要我得到
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class com.flyingspaniel.so.NoAnnotation and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) )
at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:51)
at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:25)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:108)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2407)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:1983)
at com.flyingspaniel.so.NoAnnotation.main(NoAnnotation.java:49)
Run Code Online (Sandbox Code Playgroud)
我猜我在某个地方遗漏了一个基本的"setThis"步骤,但不知道是什么.谢谢!
编辑:当我按照例外中的说明并添加一行
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
Run Code Online (Sandbox Code Playgroud)
我不再获得异常,但结果是一个空的JSON字符串,"{}".
编辑2:如果我将字段公开,它可以工作,但这不是一个合理的对象设计.
如果你想以正确的方式使用注释混合来声明它是:
static class JacksonMixIn {
@JsonProperty Date created;
@JsonProperty String name;
@JsonProperty int id;
@JsonProperty List<URL> urls;
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以控制要序列化的字段,只需在混合中包含/排除它们.
我想到了.如果要访问私有字段,则需要通过添加以下行来使用"可见性":
objectMapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(Visibility.ANY));
Run Code Online (Sandbox Code Playgroud)
对于受保护的字段,您也可以使用 Visibility.PROTECTED_AND_PUBLIC
| 归档时间: |
|
| 查看次数: |
8674 次 |
| 最近记录: |