Пользовательские конечные точки отдыха Quarkus с PanacheEntityResource - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь проработать несколько руководств по quarkus, и у меня возникла проблема с созданием простой конечной точки REST. Я следую этому руководству: https://quarkus.io/guides/rest-data-panache.

Я использую подход из руководства для создания интерфейса, расширяющего PanacheEntityResource

public interface ActorResource extends PanacheEntityResource<Actor, Long>{
    
        
}

Соответствующая сущность:

@Entity
public class Actor extends PanacheEntity{
    
    
    public String first_name;
    public String last_name;
    public Timestamp last_update;
    
    public static List<Actor> findByFirstName(String name) {
        return list("first_name", name);
    }
    

}

Как и в руководстве, при выполнении этого действия автоматически генерируются базовые c конечные точки отдыха для getById, getAll, create, update и удалить. Как вы можете видеть в моем классе Entity, у меня есть метод findByFirstName, который получает все объекты, которые соответствуют заданному параметру "name" метода. Теперь я хочу предоставить конечную точку REST для этого метода. Я до сих пор нашел способ реализовать это, но это кажется неправильным. Мне не удалось реализовать конечную точку REST для метода непосредственно в интерфейсе.

@ResourceProperties(path = "actors")
public interface ActorResource extends PanacheEntityResource<Actor, Long>{
    
    
    @GET
    @Produces("application/json")
    @Path("/first_name={name}")
    public static List<Actor> getByFirstName(@PathParam("name") String name) {
        return Actor.findByFirstName(name);
    }
    
        
}

В этой реализации ошибок нет, но конечная точка REST не отображается. Как я уже сказал, я нашел способ сделать это, а именно создать интерфейс, как показано в первой скобке кода, без ничего в нем и в дополнение к этому классу ResourceClass, в котором я реализую свою настраиваемую конечную точку. Чтобы уменьшить беспорядок (в IDE), я объединил это, поэтому интерфейс создается внутри моего ResourceClass следующим образом (пример для другого объекта): * конечные точки отдыха генерируются автоматически, и внутри класса ресурсов я могу добавлять другие конечные точки, но мне кажется, что это неправильный подход. Я ошибаюсь, и я должен это делать именно так, или есть способ реализовать это только с помощью интерфейса, который изначально использовался в руководстве?

1 Ответ

0 голосов
/ 12 июля 2020

Я думаю, что добавление пользовательских конечных точек прямо в сгенерированные классы ресурсов пока не поддерживается, потому что это все еще экспериментальная функция только для оценки. Не стесняйтесь сообщать о проблемах в трекере проблем Quarkus GitHub.

Я думаю, что лучший способ добавить пользовательские конечные точки - это создать второй класс ресурсов с тем же путем. Затем вы можете определить там свои собственные конечные точки. Если у вас нет конфликтов имен, это сработает. Я протестировал его с помощью hibernate-orm-panache-quickstart со следующими изменениями кода:

My Entity с моим настраиваемым запросом:

@Entity
@Cacheable
public class Fruit extends PanacheEntity {

    @Column(length = 40, unique = true)
    public String name;

    public Fruit() {
    }

    public Fruit(String name) {
        this.name = name;
    }

    public static Fruit findByName(String name) {
        return find("name=?1", name).firstResult();
    }
}

Ресурс для сгенерированного отдыха - api (удалите данный ресурс в этом руководстве):

public interface FruitResource extends PanacheEntityResource<Fruit, Long> {
}

Мой конкретный c ресурс:

@Path("fruit")
@ApplicationScoped
@Produces("application/json")
@Consumes("application/json")
public class FruitSpecificResource {

    @GET
    @Path("/first_name={name}")
    public Fruit getByName(@PathParam("name") String name) {
        return Fruit.findByName(name);
    }

}

Я также добавил openapi и заменил postgres на h2 в целях тестирования . Вот мои зависимости:

        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-orm-panache</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-resteasy-jsonb</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-jdbc-h2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-smallrye-openapi</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-orm-rest-data-panache</artifactId>
        </dependency>

И я изменил application.properties на это:

quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.url=jdbc:h2:mem:test
quarkus.datasource.jdbc.max-size=8
quarkus.datasource.jdbc.min-size=2

quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.log.sql=true
quarkus.hibernate-orm.sql-load-script=import.sql

Хорошо, теперь я могу запустить quarkus: dev и появится swagger-ui под localhost: 8080 / swagger-ui

Новая конечная точка там . Тестировал вручную. Работает.

...