ClassCastException при использовании ModelMapper для сопоставления поля, расширяющего универсальный тип.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ClassCastException при использовании ModelMapper для сопоставления поля, расширяющего универсальный тип.

Сообщение Anonymous »

У меня есть следующая структура класса (код в конце):
  • abstract class AbstractThing: У меня есть несколько разных вещей с общими полями.
  • class Foo extends AbstractThing: foo — это один из видов
  • abstract class AbstractReq : у меня есть запросы, относящиеся к вещам, где предметом запроса является поле (T subject)
  • FooReq extends AbstractReq: запросы, касающиеся foos, в частности
  • FooReqDto: класс DTO со всеми полями в FooReq, сглаженный
Я пытаюсь сопоставить экземпляр FooReq в FooReqDto с помощью ModelMapper. Если мне не нужно настраивать сопоставления типов, все работает отлично. Но мне (в моем реальном коде) нужно настроить некоторые вещи, представленные полем с именем SomethingDifferent вместо subjectFooField в FooReqDto. Теперь, когда я запускаю тест, я получаю следующую ошибку:

java.lang.ClassCastException: class com.example.test.TempTest$AbstractThing$ByteBuddy$ PsTTXfw5 нельзя привести к классу com.example.test.TempTest$Foo (com.example.test.TempTest$AbstractThing$ByteBuddy$PsTTXfw5 и com.example.test.TempTest$Foo находятся в безымянном модуле загрузчика "app")< /p>

Чего мне не хватает при создании карты типов? Кажется, что нет какой-либо внутренней проблемы с классами сопоставления, в которых задействовано наследование и дженерики, поскольку это работает, когда сопоставления нет. И фактические сопоставления, которые я использую, работали нормально до того, как я извлек абстрактные классы (что необходимо, чтобы сократить количество дублирующегося кода).
Вот полный код:
package com.example.test;

import org.junit.Test;
import org.modelmapper.ModelMapper;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

public class TempTest {

@Test
public void testStuff() {
final ModelMapper mapper = new ModelMapper();
mapper.createTypeMap(FooReq.class, FooReqDto.class)
.addMappings(map -> {
map.map(req -> req.getSubject().getFooField(), FooReqDto::setSomethingDifferent);
});
final FooReq req = new FooReq();
req.setSubmitted(true);
req.getSubject().setName("testFoo");
req.getSubject().setFooField("bar");
final FooReqDto dto = mapper.map(req, FooReqDto.class);
assertTrue(dto.isSubmitted());
assertEquals("testFoo", dto.getSubjectName());
assertEquals("bar", dto.getSomethingDifferent());
}

public static abstract class AbstractThing {
private String name;

// getters and setters omitted
}

public static class Foo extends AbstractThing {
private String fooField;

// getters and setters omitted
}

public static abstract class AbstractReq {
protected T subject;
private boolean submitted;

// getters and setters omitted
}

public static class FooReq extends AbstractReq {
public FooReq() {
super();
subject = new Foo();
}
}

public static class FooReqDto {
private boolean submitted;
private String subjectName;
private String somethingDifferent;

public FooReqDto() {

}

// getters and setters omitted
}
}



Подробнее здесь: https://stackoverflow.com/questions/784 ... -a-generic
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»