Создание объектов с вложенными интерфейсами - PullRequest
0 голосов
/ 07 января 2020

Я использую функцию Spring Cloud 3.0.1 и Spring Data для запуска приложения Azure Functions.

У меня есть два класса сущностей, один из которых содержит друг друга. оба класса реализуют интерфейс. Я использую интерфейсы, поэтому у меня может быть несколько модулей для разных платформ в моем проекте maven, и я могу отделить функции logi c от настроек Plattform Speci c. поэтому функции обрабатывают интерфейсы и платформы имеют определенные c реализации.

@DynamoDBTable(tableName = "Meetings")
public class DynamoDBMeeting implements Meeting {

    String id;
    String name;
    Set<? extends Appointment> appointments;

    public DynamoDBMeeting(String name, Set<DynamoDBAppointment> appointments) {
        this.name = name;
        this.appointments = appointments;
    }

    public DynamoDBMeeting() {

    }

    @DynamoDBHashKey
    @DynamoDBAutoGeneratedKey
    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @DynamoDBTypeConverted(converter = AppointmentConverter.class)
    public Set<Appointment> getAppointments() {
        return new HashSet<Appointment>(this.appointments);
    }

    public void setAppointments(Set<? extends Appointment> appointments) {
        this.appointments = appointments;
    }


    @Override
    public String toString() {
        return "Meeting{" +
                "name='" + name + '\'' +
                ", appointments=" + appointments +
                '}';
    }
}
@DynamoDBDocument
public class DynamoDBAppointment implements Appointment {
    @DynamoDBAttribute
    private int counter;

    @DynamoDBAttribute
    private String timestamp;
    @Override
    public int getCounter() {
        return this.counter;
    }

    @Override
    public void setCounter(int counter) {
        this.counter = counter;
    }

    @Override
    public String getTimestamp() {
        return this.timestamp;
    }

    @Override
    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }
}

Функция:

@Component
public class CreateMeeting implements Function<Meeting, String> {


    @Autowired
    MeetingDao dao;


    @Override
    public String apply(Meeting meeting) {
        System.out.println("Create Function Spring");
        System.out.println("received :" + meeting.getName());
        System.out.println("received :" + meeting.getAppointments());
        Meeting tmp = dao.createEntity(meeting);

        return tmp.getId();
    }
}

Это работает для AWS, но не для Azure. Функциональный обработчик:

public class CreateFunctionHandler extends AzureSpringBootRequestHandler<DynamoDBMeeting, String> {

    @FunctionName("create")
    public String execute(@HttpTrigger(name = "req",
            methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS)
                                                   HttpRequestMessage<Optional<DynamoDBMeeting>> request,
                                       ExecutionContext context) {
        System.out.println(request);
        return handleRequest(request.getBody().get(), context);
    }

}

Когда я пытаюсь создать объект собрания с запросом публикации, я получаю следующую ошибку:

[WARNING] {CheckedBiFunction.tryApply}: UnsupportedOperationException: Interface can't be instantiated! Interface name: de.nowak.base.enitites.Appointment
System.Private.CoreLib: Exception while executing function: Functions.create. System.Private.CoreLib: Result: Failure
Exception: ClassCastException: Cannot convert com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource@2f2d9bb8to type com.microsoft.azure.functions.HttpRequestMessage<java.util.Optional<de.nowak.simple.azure.entities.DynamoDBMeeting>>
Stack: java.lang.ClassCastException: Cannot convert com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource@2f2d9bb8to type com.microsoft.azure.functions.HttpRequestMessage<java.util.Optional<de.nowak.simple.azure.entities.DynamoDBMeeting>>

Есть ли способ указать azure, чтобы использовать DynamoDBAppointment создать экземпляр AppointmentInterface с помощью DynamoDBAppoinment? Чтение собраний из базы данных работает с помощью Typeconverter и Serializer.

...