Отображение Orika для неизменяемого списка

У меня есть два класса bean-компонентов immutable, для которых я использую сопоставление Orika для копирования значений из одного в другой. Однако, когда я пытаюсь скопировать unmodifiableList через сопоставление Orika, это не удается, выдавая следующее исключение:

java.lang.UnsupportedOperationException 
at ma.glasnost.orika.ExceptionUtility.newMappingException(ExceptionUtility.java:55)
at ma.glasnost.orika.impl.MapperFacadeImpl.map(MapperFacadeImpl.java:681)
at ma.glasnost.orika.impl.MapperFacadeImpl.map(MapperFacadeImpl.java:650)
at com.myproject.OrikaTest.testEmployeeMapping

Я предоставил приведенный ниже код, с помощью которого вы можете воспроизвести ту же проблему:

EmployeeDto class:

public final class EmployeeDto {
    private final int id;
    private final String name;
    private final List<String> previousGrades;

    public EmployeeDto(int id, String name, List<String> previousGrades) {
        this.id = id;//validations removed
        this.name = name;//validations removed
        //Commented unmodifiableList as it does not work
        //this.previousGrades = Collections.unmodifiableList(previousGrades);
        this.previousGrades = previousGrades;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public List<String> getPreviousGrades() {
        //tried like this, even this does not work
        return Collections.unmodifiableList(previousGrades);
    }
}

Класс сотрудников:

public final class Employee {
    //ditto AS EmployeeDto
}

Класс OrikaTest:

public class OrikaTest {

    private static final MapperFactory mapperFactory = 
           new DefaultMapperFactory.Builder().build();

    private static final MapperFacade mapperFacade = 
             mapperFactory.getMapperFacade();

    @Test
    public void testEmployeeMapping() {
        List<String> employeeGrades = Arrays.asList("A", "B");
        Employee employee = new Employee(1234, "John", employeeGrades);

        EmployeeDto employeeDto = mapperFacade.map(employee, EmployeeDto.class);

        //tests using assertEquals
        Assert.assertEquals(employeeGrades, employeeDto.getPreviousGrades());
    }
}

Я мог найти ссылку здесь на эту тему, но это было не так ясно поскольку альтернативы не были объяснены должным образом.

Итак, можете ли вы помочь с примером или каким-либо обходным путем, как скопировать unmodifiableList через сопоставление Orika?


person developer    schedule 06.02.2018    source источник


Ответы (1)


Если дело в том, что Orika должна иметь возможность изменять компоненты списка сопоставленных объектов, то можно обойти следующее:

Добавьте к своим объектам метод freeze. Когда объекты создаются, они находятся в изменяемом состоянии. После вызова freeze больше невозможно изменять объекты.

Это может быть реализовано так:

public final class EmployeeDto {
    private final int id;
    private final String name;
    private List<String> previousGrades;

    public EmployeeDto(int id, String name, List<String> previousGrades) {
        this.id = id;//validations removed
        this.name = name;//validations removed
        this.previousGrades = previousGrades;
    }

    public void freeze() {
        previousGrades = Collections.unmodifiableList(previousGrades)
    }

    public List<String> getPreviousGrades() {
        return previousGrades;
    }
}
person Lii    schedule 06.02.2018
comment
Проблема с этим подходом заключается в том, что мы не можем гарантировать, что вызывается метод freeze() (каждый раз после создания объекта), я имею в виду, что с точки зрения разработчика легко забыть вызвать этот метод. - person developer; 07.02.2018