com.fasterxml.jackson.databind.JsonMappingException через цепочку ссылок, когда есть несоответствие между типом элемента и методами доступа - PullRequest
2 голосов
/ 22 октября 2019

Существует ли конфигурация, позволяющая Джексону изящно обрабатывать несоответствие членов между типом переменной члена и типом, используемым в получателе / ​​установщике? Например, если объявлена ​​закрытая переменная с типом Long и ее методы доступа используют тип long , у нас возникла проблема. Кроме того, мы имеем дело с кодом, который нельзя изменить:

Например, рассмотрим этот класс:

    public class EventArgs {

        private Long id;
        private String message;


        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public long getId() {
            return id;
        }

        public void setId(long id) {
            this.id = id;
        }

}

Рассмотрим соответствующий тест:

@Test
    public void shouldSerializeToString() {

        ObjectMapper mapper = new ObjectMapper();
        String value = null;
        try {
            value = mapper.writeValueAsString(new EventArgs());
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        Assert.assertNotNull(value);
    }

Тестзавершается с этим исключением:

com.fasterxml.jackson.databind.JsonMappingException: (было java.lang.NullPointerException) (через цепочку ссылок: com.sailpoint.orchestration.zeebe.model.EventArgs ["id "]) в com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath (JsonMappingException.java:394) в com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath (JsonMappingException.java:353) в com.fx. .ser.std.StdSerializer.wrapAndThrow (StdSerializer.java:316) при com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields (BeanSerializerBase.java:729) при com.fasterxml.jackson.databind.ser.BeanSerializer.serialize (BeanSerializer.java:166) в com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize (DefaultSerializerProvider.java:480) вcom.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue (DefaultSerializerProvider.java:319) в com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue (ObjectMapper.java:4094.ind.ject.ject.ject.ject.ject. writeValueAsString (ObjectMapper.java:3404) в com.sailpoint.orchestration.zeebe.workers.EventArgsTests.shouldSerializeToString (EventArgsTests.java:19) в sun.reflect.NativeMethodAccessorImpl.invoke.homp.hotef ()NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.un.mo.Me. runReflectiveCall (FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosivejg ().junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4Cunjit.itunit.itunit.itunit.unun.itun.unun.unun.unun.it.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:57) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners.ParentRunner $ 1.schedule или родительский классjunit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner )jпо адресу org.junit.runners.ParentRunner.run (ParentRunner.java:363) по адресу org.junit.runner.JUnitCore.run (JUnitCore.java:137) по адресу com.intellij.junit4.JUnit4IdeaTestRunner.Unt) в com.intellij.rt.execution.junit.IdeaTestRunner $ Repeater.startRunnerWithArgs (IdeaTestRunner.java:47) в com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart (JUnitjava: 242) at com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java:70). Причина: java.lang.NullPointerException в com.sailpoint.orchestration.zeebe.model.EventArgs.getId (EventArgs. Java: 18) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessormphoj (в java.lang.reflect.Method.invoke (Method.java:498) в com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField (BeanPropertyWriter.java:688) в com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields (BeanSerializerBase.java:721) ... еще 28

java.lang.AssertionError at org.junit.Assert.fail (Assert.java:86) в org.junit.Assert.assertTrue(Assert.java:41) в org.junit.Assert.assertNotNull (Assert.java:712) в org.junit.Assert.assertNotNull (Assert.java:722) в com.sailpoint.orchestration.zeebe.workers.EventArgsTests. shouldSerializeToString (EventArgsTests.java:24) в sun.reflect.NativeMethodAccessorImpl.invoke0 (нативный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:jmpho.java.jpg). в java.lang.reflect.Method.invoke (Method.java:498) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) в org.junit.internal.runners.eetateInvokeMethod.java:17) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.jrjjununununununun.unjun.unj) .78))(BlockJUnit4ClassRunner.java:57) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.unnersParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.ParentRunner $ 2.оценке (ParentRunner.java:268itg или в.runners.ParentRunner.run (ParentRunner.java:363) в org.junit.runner.JUnitCore.run (JUnitCore.java:137) в com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerTitAIJ (tRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner $ Repeater.startRunnerWithArgs (IdeaTestRunner.java:47) в com.intellij.rt.execution.junit.JUnitStarter.prepStStart.And ()на com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java:70)

1 Ответ

0 голосов
/ 22 октября 2019

Вы можете сказать Джексону не использовать getters и setters и использовать только поля:

ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); //turn off everything
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); // only use fields

или если вы хотите отключить ТОЛЬКО геттеры и сеттеры и использовать поля (и разрешить другие, такие как JsonCreator):

mapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

Выходной JSON будет:

{"id":null,"message":null}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...