Переопределить toString внутреннего объекта - PullRequest
0 голосов
/ 03 января 2019

Я переопределил toString () объекта с именем Skeleton , поэтому при вызове toString () переменная цвета исключается.

public class Skeleton
{
    private List bones;
    private Color color;

    //  getters & setters

    @Override
    public String toString() 
    {
        String s = null;

        ObjectMapper mapper = new ObjectMapper();
        mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector(){
        @Override
        public boolean hasIgnoreMarker(final AnnotatedMember m) {
                List<String> exclusions = Arrays.asList("color");
                return exclusions.contains(m.getName())|| super.hasIgnoreMarker(m);
            }
        });

        try 
        {
            s = mapper.writeValueAsString(this);

        } catch (JsonProcessingException e) {

            e.printStackTrace();
        }

        return s;
    }
}

Однако, когда я добавляю объект Skeleton в качестве переменной к объекту с именем Body и вызываю toString () для Body, поле color Skeleton имеет вид включен.

public class Body
{
    private Skeleton skeleton = ....

Кто-нибудь знает, как заставить Body использовать переопределенный метод toString () в Skeleton?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вместо того, чтобы вручную исключать поля в методе toString, что может быть утомительным и подверженным ошибкам, если другие поля необходимо исключить (или если color больше не следует исключать), вы можете использовать Jackson @JsonIgnore аннотация.Затем метод toString в Skeleton может быть переопределен для печати сериализованной строки:

public class Skeleton {

    private List bones;

    @JsonIgnore
    private Color color;

    @Override
    public String toString() {

        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(this);
        } 
        catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

Как упоминалось в комментариях, использование ObjectMapper для сериализации объекта в String может бытьдорого, если часто используется toString метод Skeleton.Если производительность становится проблемой, ObjectMapper следует использовать только для сериализации самого верхнего объекта (например, Body), а не для каждого промежуточного объекта (например, Skeleton):

public class Skeleton {

    private List bones;

    @JsonIgnore
    private Color color;

    // Getters & setters
}

public class Body {

    private Skeleton skeleton;

    @Override
    public String toString() {

        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(this);
        } 
        catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

Редактирование на основе обратной связи ОП

В случае, если вы хотите игнорировать поле только для определенного ObjectMapper, вы можете создать SimpleBeanPropertyFilter и указать имяигнорируемое поле:

public class Skeleton {

    private List bones;
    private Color color;

    @Override
    public String toString() {

        try {
            ObjectMapper mapper = new ObjectMapper();
            FilterProvider filters = new SimpleFilterProvider()
                .addFilter("ignoreColor", SimpleBeanPropertyFilter.serializeAllExcept("color"));
            return mapper.writer(filters).writeValueAsString(this);
        } 
        catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

Для получения дополнительной информации см. Раздел 5: Игнорировать поля с использованием фильтров на Джексон Игнорировать свойства при маршаллинге .

0 голосов
/ 03 января 2019

Вы должны переопределить метод toString() класса Body и включить все детали, которые вы считаете необходимыми. Включите метод toString() переменной экземпляра private Skeleton skeleton = ... и все другие переменные-члены, которые могут быть в классе Body.

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