Я использую функцию 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.