Quarkus中PanacheRepositoryResource自定义端点事务异常求助
问题解决:Quarkus Hibernate Rest Data Panache 事务异常与基础POST接口调用
一、自定义端点事务异常解决
你的问题核心是@Transactional注解放在接口的default方法上时,Quarkus的事务拦截器无法正确生效——因为Rest Data Panache是动态生成接口实现类,接口默认方法的注解不会被代理拦截,导致事务未激活。
推荐解决方案:将业务逻辑移至Repository类
- 在
EntityRepository中实现带事务注解的持久化方法:
@ApplicationScoped public class EntityRepository implements PanacheRepository<Entity> { @Transactional public Entity persistAndReturn(Entity entity) { persist(entity); return entity; } }
- 在
EntityResource的default方法中调用Repository的方法:
@ResourceProperties public interface EntityResource extends PanacheRepositoryResource<EntityRepository, Entity, Long> { @POST @Path("/foo") default Entity fooMethod(Entity entityToPersist) { // 直接使用PanacheRepositoryResource提供的repository()方法获取实例,无需手动CDI查找 return repository().persistAndReturn(entityToPersist); } }
此方案利用Repository作为CDI bean的特性,让事务注解被正常拦截,同时避免了手动CDI查找的冗余代码。
二、调用基础POST接口
Rest Data Panache会自动为PanacheRepositoryResource生成标准CRUD接口,基础POST接口对应实体的创建操作,使用方式如下:
1. 外部HTTP调用
直接向资源根路径发送POST请求,请求体为Entity的JSON格式数据。假设你的资源路径为/entities,示例请求:
curl -X POST -H "Content-Type: application/json" -d '{"name":"test", "value":"demo"}' http://localhost:8080/entities
2. 应用内部调用
可以直接注入EntityResource实例(Quarkus会动态生成实现类),调用其内置的create()方法(该方法对应基础POST接口):
@Inject EntityResource entityResource; // 在业务方法中调用 public void createEntity() { Entity newEntity = new Entity(); newEntity.setName("test"); Entity created = entityResource.create(newEntity); }
内容的提问来源于stack exchange,提问作者Francesco Steccanella
相关产品推荐
相关产品推荐

