簡體   English   中英

不可修改清單的Orika對應

[英]Orika Mapping for unmodifiable List

我有兩個不可變的 bean類,正在使用Orika映射將它們從一個值復制到另一個。 但是,當我嘗試通過Orika映射復制unmodifiableList ,由於拋出以下異常而失敗:

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類:

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());
    }
}

在這里可以找到有關此主題的鏈接,但是由於沒有正確解釋替代方法,因此不清楚。

因此,您能否提供有關如何通過Orika映射復制unmodifiableList的示例或任何變通方法?

如果情況是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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM