Как создать приложение Hello World с помощью платформы SAP CAP Java

В новом фреймворке SAP CAP появилось довольно много руководств, но большинство из них посвящены вкусу NodeJS фреймворка; версия Java, похоже, отстает. По этой причине я решил создать свою собственную серию руководств по CAP Java. Эта серия предполагает нулевое знание SAP, поэтому даже новички в SAP должны иметь возможность следовать ей. В этой первой части мы покажем вам, как создать простое приложение Hello World.

Примечание: код, использованный в этом руководстве, можно найти здесь.

Шаг 1. Настройка среды разработки

Во-первых, нам нужно установить необходимые зависимости для разработки и развертывания CAP Java. Просмотрите список ниже и убедитесь, что у вас есть все.

Кроме того, в этом руководстве мы будем использовать VS Code вместе со следующими пакетами поддержки.

Шаг 2: Создание приложения

Затем нам нужно сгенерировать наше новое приложение. Поскольку это приложение Hello World, назовем его helloworld.

cds init helloworld --add java

Вы должны увидеть следующий результат:

Далее переходим в папку приложения:

cd helloworld

Установите зависимости Java:

mvn clean install

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

Откройте VS Code и проверьте сгенерированные файлы и папки:

code .

Пока нам не о чем беспокоиться, кроме папки srv, в которой находится серверная часть нашего проекта. На следующем этапе мы собираемся настроить службу oData (т. Е. REST API, соответствующий протоколу oData).

Шаг 3 Определение сервиса с CDS

Одна из замечательных составляющих CAP - это то, насколько просто настроить полнофункциональный REST API. Посмотрим, как это сделать.

Сначала создайте новый файл и назовите его say.cds.

touch ./srv/say.cds

Внутри файла добавьте следующий код:

service say {
  function hello (to:String) returns String;
}

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

  • Ключевое слово service создает службу oData.
  • say определяет имя службы.
  • Определение службы содержится в {}.
  • function, как вы могли догадаться, инициирует определение функции.
  • hello - это имя функции.
  • () содержит входной параметр.
  • to - это имя параметра.
  • Строка - это тип ввода.
  • return указывает, что следующее будет определять тип возвращаемого значения.
  • Строка - это тип, возвращаемый этой функцией.

Обратите внимание, что здесь нет логики для функции. CDS определяет функцию только с точки зрения конечной точки API, типа данных, которые функция ожидает получить, и типа данных, которые вызывающий абонент должен ожидать обратно. Фактическая обработка ввода будет происходить в нашем файле Java, который мы создадим дальше.

Шаг 4: Создание обработчика событий в Java

Дом для нашего обработчика событий находится немного в глубине некоторых сгенерированных папок, поэтому давайте взглянем на нашу структуру папок, чтобы точно увидеть, где находятся наши обработчики.

По соглашению мы создадим папку с названием handlers для хранения нашего обработчика и создадим файл с именем SayHandler.java. Обратите внимание, что имя файла и имя папки - это просто условные обозначения - вы можете называть их как хотите.

mkdir srv/src/main/java/customer/helloworld/handlers
touch srv/src/main/java/customer/helloworld/handlers/SayHandler.java

Проверим результат:

Если ваша среда разработки настроена правильно, вы должны увидеть уже сгенерированный шаблон. Если нет, скопируйте и вставьте его.

package customer.helloworld.handlers;
public class SayHandler {
}

Затем мы должны превратить этот базовый класс в обработчик событий, реализовав класс EventHandler, который является частью Java CDS SDK.

import com.sap.cds.services.handler.EventHandler;
public class SayHandler implements EventHandler {
}

Затем мы должны добавить некоторые украшения, чтобы связать этот универсальный обработчик событий со службой oData, которую мы определили на предыдущем шаге. Однако, прежде чем мы это сделаем, мы должны создать несколько файлов поддержки, которые нам помогут. Еще раз запустите mvn clean install. Вы должны увидеть следующие сгенерированные папки и файлы:

Заглянем внутрь Say_.java.

Здесь особо не на что смотреть, просто простой интерфейс, содержащий строку CDS_NAME, которая преобразуется в значение say, имя нашей службы. Это сделано для того, чтобы упростить нам написание нашей программы без случайной опечатки в строковом литерале.

Вернемся к SayHandler.java и украсим наш класс следующим образом:

// ...
import org.springframework.stereotype.Component;
import com.sap.cds.services.handler.annotations.ServiceName;
import cds.gen.say.Say_;
@Component
@ServiceName(Say_.CDS_NAME)
public class SayHandler implements EventHandler {
}

Сначала мы добавляем аннотацию @Component из SpringBoot. У нас нет времени вдаваться в подробности, что это делает здесь, но если вам интересно, ознакомьтесь с этой статьей.

Затем мы добавляем аннотацию @ServiceName из CDS SDK и передаем в качестве аргумента значение CDS_NAME из класса Say_, который мы видели ранее (разрешается как «сказать»). Вот как CAP идентифицирует этот конкретный обработчик со службой «say».

Теперь мы подошли к тому, что нам действительно нужно: к логике обработки нашей функции, которую мы определили в CDS на предыдущем шаге. Добавьте следующий код:

// ...
import cds.gen.say.HelloContext;
import com.sap.cds.services.handler.annotations.On;
@Component
@ServiceName(Say_.CDS_NAME)
public class SayHandler implements EventHandler {
@On(event = HelloContext.CDS_NAME)
  public void sayHello(HelloContext context) {
  }
}

Вверху мы импортируем HelloContext, который был автоматически сгенерирован ранее вместе с Say_.java. Мы также импортируем аннотацию обработчика службы On, которая позволяет нам украсить функцию, чтобы указать, что она будет обрабатывать определенное событие.

Затем мы добавляем аннотацию @On () с аргументом event = HelloContext.CDS_NAME. Если мы проверим файл HelloContext.java, мы увидим, что он содержит значение «hello», которое является именем функции, которую мы определили на предыдущем шаге.

С помощью этой аннотации мы говорим платформе CAP запускать этот код каждый раз, когда запускается событие «hello», или, другими словами, каждый раз, когда срабатывает конечная точка API, которую мы создали в нашем файле CDS ранее, запускайте этот код.

Затем мы объявили общедоступный метод без возвращаемого значения под названием «sayHello». Обратите внимание, что имя функции вообще не имеет значения - фреймворк знает, как связать его с определением функции CDS с помощью аннотации @On. Также обратите внимание, что мы не указали возвращаемый тип. Это потому, что результат будет потерян другими способами, как мы увидим позже.

Следующее, что мы сделали, - это передали экземпляр HelloContext в качестве входных данных. Вы заметите, что в файле HelloContext.java есть метод create (). За кулисами CAP вызывает этот метод для создания контекста, а затем передает его в эту функцию. Эта переменная контекста будет содержать входной параметр, который мы будем обрабатывать в теле нашей функции.

И, наконец, вот наша логика:

// ...
@On(event = HelloContext.CDS_NAME)
public void sayHello(HelloContext context) {
  String name = context.getTo();
  String greeting = "Hello " + name + "!";
  context.setResult(greeting);
}

В строке 18 мы вызываем функцию «getTo ()» в «контексте», чтобы получить ввод, который был передан при вызове API (подробности см. В HelloContext.java). Мы назвали эту переменную «name», потому что предположительно значение «to» - это имя человека.

В строке 19 мы создаем новую строку под названием «приветствие», которая будет содержать наш окончательный результат. Если предположить, что значение «to» было «Bob», то мы получили бы «Hello Bob!».

Наконец, мы устанавливаем результат контекста с помощью метода setResult (), передавая «приветствие» в качестве аргумента. Обратите внимание, что этой функции не требуется возвращаемое значение. При установке результата контекста результат будет передан обратно в структуру, которая проанализирует его в JSON и вернет его вызывающей стороне. Давайте запустим этот код и проверим результат!

Часть V: Проверка результата

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

mvn spring-boot:run

На этом этапе вы увидите довольно загадочное сообщение об ошибке:

Причина этого сбоя в том, что CAP Java действительно хочет создать базу данных, но поскольку мы еще не создали модель данных, фреймворку не на чем создавать базу данных, и он терпит неудачу. Давайте сделаем простую модель данных, чтобы сделать фреймворк счастливым. Подробнее об определении моделей данных мы поговорим в следующем руководстве.

Найдите папку с именем db и создайте в ней файл с именем User.cds.

Внутри файла скопируйте следующий код:

define entity User {
  name : String;
}

Это создаст простую таблицу базы данных пользователей с полем под названием «имя». Этим CAP будет доволен. Попробуйте запустить команду запуска (mvn spring-boot-run) еще раз.

Если на этом закончили, значит все хорошо:

По умолчанию приложение загружается на localhost: 8080. Щелкните ссылку ниже, чтобы попробовать:

Http: // localhost: 8080 / odata / v4 / say / hello (to = 'Tommy')

Должен получиться следующий результат:

Попробуйте заменить Томми чем угодно, чтобы приветствие было с другими именами.

Вывод

В этом уроке мы узнали, как создать простое приложение hello world, используя платформу SAP CAP Java.

Если вы ищете что-то более продвинутое, ознакомьтесь с моим учебником из 6 частей по использованию CAP Java для подключения к системе S / 4 HANA.