当前位置: 首页 > 知识库问答 >
问题:

使用PanacheEntityResource的Quarkus自定义restendpoint

习洲
2023-03-14

我试图通过quarkus的一些教程,在创建一个简单的RESTendpoint时遇到了一个问题。下面是本教程:https://quarkus.io/guides/rest-data-panache。

Im使用指南中的方法创建扩展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);
    }
    

}
@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);
    }
    
        
}
@Path("/countries")
@ApplicationScoped
@Produces("application/json")
public class CountryResource  {
    
    @GET
    @Path("/name={name}")
    public List<Country> getByName(@PathParam("name") String name) {
        return Country.findByName(name);
    }
    
    @ResourceProperties(path = "/countries")
    public interface CountryResourceTest extends PanacheEntityResource<Country, Long>{
        
    }

}

共有1个答案

公冶泰
2023-03-14

我认为直接向生成的资源类添加自定义endpoint还不受支持,因为这仍然是一个仅用于评估的试验性特性。在Quarkus的GitHub问题跟踪器中,可以随时给出问题反馈。

我认为添加自定义endpoint的最佳方法是创建具有相同路径的第二个资源类。然后您可以在那里定义您的自定义endpoint。如果您没有名称冲突,那么它将起作用。我使用hibernate-orm-panache-quickstart对其进行了测试,并修改了以下代码:

具有自定义查询得我得实体:

@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();
    }
}

生成的rest-api的资源(在本教程中删除给定的资源):

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

我的特定资源:

@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并用h2替换了postgres。以下是我的依赖项:

        <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>
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了,在localhost:8080/swagger-ui下面会有一个swagger-ui

新的endpoint就在那里。我手动测试过。它起作用了。

 类似资料:
  • 我目前正在开发一个尽可能尊重六边形架构原则的应用程序。 因此,我的“域”模块(组Id: ; 工件Id:)不依赖于任何技术框架。 我的所有服务都使用自定义注释(本身是我域的一部分)进行注释: 然而,在我的“Quarkus应用”模块(groupId:< code > acme ;artifact id:< code > app-quar kus ,我需要注入我的“域”模块中定义的服务(< code>a

  • null 我尝试将@priority(interceptor.priority.platform_beform)和@prematching也放入我的过滤器中,但即使是在OIDC启动后也会调用。 另外,是否有任何方法支持扩展quarkus oidc逻辑以包括自定义代码? 我无法获得oidc和keycloak-auth拦截器的优先级(知道这些可以帮助我决定过滤器的优先级)。请帮忙。

  • 我是Quarkus新手,我编写了一个提供rest API的扩展,我们称之为。 其思想是,扩展将提供应用程序所需的rest资源,应用程序提供业务逻辑。 因此,我创建了一个Kwkus项目,该项目使用该扩展并提供了一个bean,该bean使用业务逻辑实现。 但是,当我启动应用程序时,不会创建endpoint,当我调用它时,它会返回。 问题是:如何使扩展中定义的rest资源对使用它的应用程序可见?

  • TL;dr:文档没有提到如何做到这一点,似乎也没有支持这一点的配置值(参见所有配置选项)。有没有一种定制日志附加器的方法? 对于测试应用程序,我喜欢评估日志消息。为此,您需要实现自己的日志附加器,将日志消息存储在某些数据结构中,然后配置您的日志后端,如果应用程序在测试上下文中运行,则额外使用此附加器。对于Logback,它只是一个 创建一个定制的日志附加器,但是不得不发现这也需要添加依赖项< co

  • 假设我有一个名为的方法的接口,它接受了的参数。在中有名为和的字段。我想模拟调用此方法的响应,并返回不同的模拟响应结果,只要ServiceRequest中的值不同。 我有以下代码,如follow(参考https://www.baeldung.com/mockito-argument-matchers),但它返回空指针异常。这里出了什么问题?

  • 我正在研究一个项目,其中上下文和会话由ThreadLocal使用ThreadPoolExecutor安全地管理(信息从线程传递到ThreadPoolExecutor内部的另一个线程)。 我们有: ThreadPoolExecutor:它实现beforeExecute和afterExecute方法行为,以确保信息从线程传递到另一个线程,并在afterExecutre方法中清除线程上下文。 Threa