Рубрики
Без рубрики

Введение в Открытую свободу

Узнайте, как использовать Open Liberty framework для создания и использования веб-службы RESTful

Автор оригинала: baeldung.

1. Обзор

С ростом популярности архитектуры микросервисов и разработки облачных приложений растет потребность в быстром и легком сервере приложений.

В этом вводном уроке мы рассмотрим Open Liberty framework для создания и использования веб-сервиса RESTful. Мы также рассмотрим некоторые из основных функций, которые он предоставляет.

2. Открытая свобода

Open Liberty-это открытый фреймворк для экосистемы Java, позволяющий разрабатывать микросервисы с использованием функций Eclipse MicroProfile и Jakarta EE платформ .

Это гибкая, быстрая и легкая среда выполнения Java, которая кажется перспективной для разработки облачных микросервисов.

Фреймворк позволяет нам настраивать только те функции, которые нужны нашему приложению, что приводит к меньшему объему памяти при запуске. Кроме того, он может быть развернут на любой облачной платформе с использованием контейнеров типа Docker и Kubernetes .

Он поддерживает быструю разработку путем живой перезагрузки кода для быстрой итерации.

3. Сборка и запуск

Сначала мы создадим простой проект на основе Maven с именем open-liberty , а затем добавим последний liberty-maven-plugin plugin в pom.xml :


    io.openliberty.tools
    liberty-maven-plugin
    3.3-M3

Или мы можем добавить последнюю версию open liberty-runtime Maven dependency в качестве альтернативы liberty-maven-plugin :


    io.openliberty
    openliberty-runtime
    20.0.0.1
    zip

Аналогично, мы можем добавить последнюю зависимость Gradle в build.gradle :

dependencies {
    libertyRuntime group: 'io.openliberty', name: 'openliberty-runtime', version: '20.0.0.1'
}

Затем мы добавим последние зависимости jakarta.jakarta-web-api и micro profile Maven:


    jakarta.platform
    jakarta.jakartaee-web-api
    8.0.0
    provided


    org.eclipse.microprofile
    microprofile
    3.2
    pom
    provided

Затем давайте добавим свойства HTTP-порта по умолчанию в pom.xml :


    9080
    9443

Далее мы создадим server.xml файл в каталоге src/main/liberty/config :


    
        mpHealth-2.0
    
    
    

Здесь мы добавили функцию mp Health-2.0 для проверки работоспособности приложения.

Вот и все со всеми основными настройками. Давайте запустим команду Maven для компиляции файлов в первый раз:

mvn clean package

Наконец, давайте запустим сервер с помощью команды Maven, предоставленной Liberty:

mvn liberty:dev

Вуаля! Наше приложение запущено и будет доступно по адресу localhost:9080 :

Кроме того, мы можем получить доступ к здоровью приложения по адресу localhost:9080/health :

{"checks":[],"status":"UP"}

Команда liberty:dev запускает Открытый сервер Liberty в режиме разработки , который выполняет горячую перезагрузку любых изменений, внесенных в код или конфигурацию, без перезапуска сервера.

Аналогично, команда liberty:run доступна для запуска сервера в рабочем режиме.

Кроме того, мы можем использовать | liberty:start-server и liberty: stop-server для запуска/остановки сервера в фоновом режиме .

4. Сервлет

Чтобы использовать сервлеты в приложении, мы добавим функцию servlet-4.0 в server.xml :


    ...
    servlet-4.0

Добавьте последнюю версию servlet-4.0 Maven dependency при использовании open liberty-runtime Maven dependency в pom.xml :


    io.openliberty.features
    servlet-4.0
    20.0.0.1
    esa

Однако если мы используем плагин liberty-maven-plugin plugin, то в этом нет необходимости.

Затем мы создадим класс App Servlet , расширяющий класс HttpServlet :

@WebServlet(urlPatterns="/app")
public class AppServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException {
        String htmlOutput = "

Hello! Welcome to Open Liberty

"; response.getWriter().append(htmlOutput); } }

Здесь мы добавили аннотацию @WebServlet , которая сделает AppServlet доступным по указанному шаблону URL.

Давайте обратимся к сервлету по адресу localhost:9080/app :

5. Создайте веб-сервис RESTful

Во-первых, давайте добавим функцию jax rs-2.1 в server.xml :


    ...
    jaxrs-2.1

Затем , мы создадим класс Api Application , который предоставляет конечные точки веб-службе RESTful:

@ApplicationPath("/api")
public class ApiApplication extends Application {
}

Здесь мы использовали аннотацию @ApplicationPath для URL-пути.

Затем давайте создадим класс Person , который обслуживает модель:

public class Person {
    private String username;
    private String email;

    // getters and setters
    // constructors
}

Далее мы создадим класс PersonResource для определения HTTP-сопоставлений:

@RequestScoped
@Path("persons")
public class PersonResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List getAllPersons() {
        return Arrays.asList(new Person(1, "normanlewis", "[email protected]"));
    }
}

Здесь мы добавили метод getAllPersons для сопоставления GET с конечной точкой /api/persons . Итак, мы готовы с веб-сервисом RESTful, и команда liberty:dev загрузит изменения на лету.

Давайте обратимся к веб-сервису /api/persons RESTful с помощью запроса curl GET:

curl --request GET --url http://localhost:9080/api/persons

Затем мы получим в ответ массив JSON:

[{"id":1, "username":"normanlewis", "email":"[email protected]"}]

Аналогично, мы можем добавить отображение POST, создав метод add Person :

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addPerson(Person person) {
    String respMessage = "Person " + person.getUsername() + " received successfully.";
    return Response.status(Response.Status.CREATED).entity(respMessage).build();
}

Теперь мы можем вызвать конечную точку с помощью запроса curl POST:

curl --request POST --url http://localhost:9080/api/persons \
  --header 'content-type: application/json' \
  --data '{"username": "normanlewis", "email": "[email protected]"}'

Ответ будет выглядеть так:

Person normanlewis received successfully.

6. Настойчивость

6.1. Конфигурация

Давайте добавим поддержку персистентности в наши веб-сервисы RESTful.

Во-первых, мы добавим зависимость derby Maven к pom.xml :


    org.apache.derby
    derby
    10.14.2.0

Затем мы добавим несколько функций, таких как jpa-2.2 , jsonp-1.1 и cdi-2.0 к server.xml :


    ...
    jpa-2.2 
    jsonp-1.1
    cdi-2.0

Здесь функция jsonp-1.1 предоставляет Java API для обработки JSON, а функция cdi-2.0 обрабатывает области действия и внедрение зависимостей.

Далее мы создадим persistence.xml в каталоге src/main/resources/META-INF :



    
        jdbc/jpadatasource
        
            
            
        
    

Здесь мы использовали EclipseLink DDL generation для автоматического создания схемы базы данных. Мы также можем использовать другие альтернативы, такие как Hibernate.

Затем давайте добавим конфигурацию DataSource в server.xml :


     


    
    

Обратите внимание, что имя jndi имеет ту же ссылку на тег jta-data-source в persistence.xml.

6.2. Сущность и DAO

Затем мы добавим аннотацию @Entity и идентификатор к нашему классу Person :

@Entity
public class Person {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private int id;
    
    private String username;
    private String email;

    // getters and setters
}

Далее давайте создадим класс PersonDao , который будет взаимодействовать с базой данных с помощью экземпляра EntityManager :

@RequestScoped
public class PersonDao {
    @PersistenceContext(name = "jpa-unit")
    private EntityManager em;

    public Person createPerson(Person person) {
        em.persist(person);
        return person;
    }

    public Person readPerson(int personId) {
        return em.find(Person.class, personId);
    }
}

Обратите внимание, что @PersistenceContext определяет ту же ссылку на тег persistence-unit в persistence.xml .

Теперь мы введем зависимость PersonDao в класс PersonResource :

@RequestScoped
@Path("person")
public class PersonResource {
    @Inject
    private PersonDao personDao;

    // ...
}

Здесь мы использовали аннотацию @Inject , предоставленную функцией CDI.

Наконец, мы обновим метод AddPerson класса Person Resource для сохранения объекта Person :

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Transactional
public Response addPerson(Person person) {
    personDao.createPerson(person);
    String respMessage = "Person #" + person.getId() + " created successfully.";
    return Response.status(Response.Status.CREATED).entity(respMessage).build();
}

Здесь метод AddPerson аннотируется аннотацией @Transactional для управления транзакциями в управляемых компонентах CDI.

Давайте вызовем конечную точку с уже обсужденным запросом curl POST:

curl --request POST --url http://localhost:9080/api/persons \
  --header 'content-type: application/json' \
  --data '{"username": "normanlewis", "email": "[email protected]"}'

Затем мы получим текстовый ответ:

Person #1 created successfully.

Аналогично, давайте добавим метод getPerson с GET mapping для извлечения объекта Person :

@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
@Transactional
public Person getPerson(@PathParam("id") int id) {
    Person person = personDao.readPerson(id);
    return person;
}

Давайте вызовем конечную точку с помощью запроса curl GET:

curl --request GET --url http://localhost:9080/api/persons/1

Затем мы получим объект Person в качестве ответа JSON:

{"email":"[email protected]","id":1,"username":"normanlewis"}

7. Используйте RESTful Web Service С Помощью JSON-B

Во-первых, мы включим возможность прямой сериализации и десериализации моделей, добавив функцию jsonb-1.0 в server.xml :


    ...
    jsonb-1.0

Затем давайте создадим класс Rest Consumer с помощью метода consumer With Json b :

public class RestConsumer {
    public static String consumeWithJsonb(String targetUrl) {
        Client client = ClientBuilder.newClient();
        Response response = client.target(targetUrl).request().get();
        String result = response.readEntity(String.class);
        response.close();
        client.close();
        return result;
    }
}

Здесь мы использовали класс Client Builder для запроса конечных точек веб-службы RESTful.

Наконец, давайте напишем модульный тест для использования веб-службы /api/person RESTful и проверим ответ:

@Test
public void whenConsumeWithJsonb_thenGetPerson() {
    String url = "http://localhost:9080/api/persons/1";
    String result = RestConsumer.consumeWithJsonb(url);        
    
    Person person = JsonbBuilder.create().fromJson(result, Person.class);
    assertEquals(1, person.getId());
    assertEquals("normanlewis", person.getUsername());
    assertEquals("[email protected]", person.getEmail());
}

Здесь мы использовали класс Jsonbuilder для разбора ответа String в объект Person .

Кроме того, мы можем использовать Микропрофильный Rest-клиент, добавив функцию mpRestClient-1.3 для использования веб-сервисов RESTful . Он предоставляет интерфейс Rest Client Builder для запроса конечных точек веб-службы RESTful.

8. Заключение

В этой статье мы рассмотрели Open Liberty framework — быструю и легкую среду выполнения Java, которая предоставляет полные возможности платформ Eclipse MicroProfile и Jakarta EE.

Для начала мы создали веб-сервис RESTful с использованием JAX-RS. Затем мы включили персистентность, используя такие функции, как JPA и CDI.

Наконец, мы использовали веб-сервис RESTful с помощью JSON-B.

Как обычно, все реализации кода доступны на GitHub .