Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义不可修改的SetMixin在Jackson 2.7+;_Java_Jackson_Jackson2 - Fatal编程技术网

Java 自定义不可修改的SetMixin在Jackson 2.7+;

Java 自定义不可修改的SetMixin在Jackson 2.7+;,java,jackson,jackson2,Java,Jackson,Jackson2,我希望能够在启用默认键入的情况下反序列化不可修改集。为此,我创建了一个不可修改的setmixin,如下所示: 注意:您可以找到一个包含所有源代码的最小项目,在 import com.fasterxml.jackson.annotation.JsonCreator; 导入com.fasterxml.jackson.annotation.JsonTypeInfo; 导入java.util.Set; @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS,include=Jso

我希望能够在启用默认键入的情况下反序列化
不可修改集
。为此,我创建了一个
不可修改的setmixin
,如下所示:

注意:您可以找到一个包含所有源代码的最小项目,在

import com.fasterxml.jackson.annotation.JsonCreator;
导入com.fasterxml.jackson.annotation.JsonTypeInfo;
导入java.util.Set;
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS,include=JsonTypeInfo.As.PROPERTY)
公共抽象类不可修改SetMixin{
@JsonCreator
公共不可修改SetMixin(集合s){}
}
然后我尝试使用它来反序列化一个空集

public class UnmodifiableSetMixinTest {
    static final String EXPECTED_JSON = "[\"java.util.Collections$UnmodifiableSet\",[]]";

    ObjectMapper mapper;

    @Before
    public void setup() {
        mapper = new ObjectMapper();
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        mapper.addMixIn(Collections.unmodifiableSet(Collections.<String>emptySet()).getClass(), UnmodifiableSetMixin.class);
    }

    @Test
    @SuppressWarnings("unchecked")
    public void read() throws Exception {
        Set<String> foo = mapper.readValue(EXPECTED_JSON, Set.class);
        assertThat(foo).isEmpty();
    }
}
public类不可修改setmixintest{
应为静态最终字符串\u JSON=“[\”java.util.Collections$UnmodifiableSet\”,[]];
对象映射器映射器;
@以前
公共作废设置(){
映射器=新的ObjectMapper();
enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.PROPERTY);
addMixIn(Collections.unmodifiableSet(Collections.emptySet()).getClass(),UnmodifiableSetMixin.class);
}
@试验
@抑制警告(“未选中”)
public void read()引发异常{
Set foo=mapper.readValue(预期为\u JSON,Set.class);
断言(foo.isEmpty();
}
}
测试通过Jackson 2.6,但使用具有以下堆栈跟踪的Jackson 2.7+失败:

java.lang.IllegalStateException: No default constructor for [collection type; class java.util.Collections$UnmodifiableSet, contains [simple type, class java.lang.Object]] at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createUsingDefault(StdValueInstantiator.java:240) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26) at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:110) at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromArray(AsArrayTypeDeserializer.java:50) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserializeWithType(CollectionDeserializer.java:310) at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:42) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3788) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2779) at sample.UnmodifiableSetMixinTest.read(UnmodifiableSetMixinTest.java:36) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) java.lang.IllegalStateException:没有[集合类型;类java.util.Collections$UnmodifiableSet,包含[简单类型,类java.lang.Object]的默认构造函数] 位于com.fasterxml.jackson.databind.desr.std.StdValueInstantiator.createUsingDefault(StdValueInstantiator.java:240) 在com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249) 在com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26) 在com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.\u反序列化(AsArrayTypeDeserializer.java:110) 在com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromArray(AsArrayTypeDeserializer.java:50) 位于com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserializeWithType(CollectionDeserializer.java:310) 在com.fasterxml.jackson.databind.desr.impl.TypeWrappedSerializer.deserialize(TypeWrappedSerializer.java:42) 位于com.fasterxml.jackson.databind.ObjectMapper.\u readMapAndClose(ObjectMapper.java:3788) 在com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2779)上 位于sample.UnmodifiableSetMixinTest.read(UnmodifiableSetMixinTest.java:36) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:498) 位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:50) 位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:47) 位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 位于org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 位于org.junit.runners.ParentRunner.run(ParentRunner.java:363) 位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
有人能帮我修复Jackson 2.7+的测试吗(我希望它能为Jackson 2.8.3工作)?

要让mix-in工作,内部类上必须有一个参数(*)构造函数;如果不是,则不会关联“混合”

但是您绝对需要使用这个JDK内部类吗?如果没有,您可以添加映射以指示您希望使用标准的
集合
实现之一,而不是使用
SimpleModule.addAbstractTypeMapping(abstractType,concreteType)
进行反序列化,注册该模块


(*)EDIT起初我说的是“零参数”构造函数;但有问题的构造函数确实有一个参数。

事实证明,这是杰克逊的回归。我创建了一个确认错误的程序

通过向我提供了一个使用自定义反序列化器的解决方案。例如:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS,include=JsonTypeInfo.As.PROPERTY)
@JsonDeserialize(使用=UnmodifiableSetDeserializer.class)
公共抽象类不可修改SetMixin{
@JsonCreator
公共不可修改SetMixin(集合s){}
}
公共类UnmodifiableSetDeserializer扩展JsonDeserializer{
@凌驾
公共集反序列化(JsonP)