我正在学习使用JAX-RS进行一些安静的api开发,并且对我的资源类有一个问题.
我的理解是我的资源类应该是RequestScoped,但是,当它是RequestScoped时,我调用实体管理器的persist方法会抛出TransactionRequiredException.
如果我将我的资源类更改为无状态,那么一切都很好,实体管理器可以保持没有任何问题.
我仍然是JavaEE的新手,想知道为什么会发生这种情况以及@Stateless注释会使持久化上下文正确注入的内容.我还想知道JAX-RS资源类是否是无状态而不是RequestScoped是否有任何问题,因为我见过的大多数教程都有.
我在下面列举了一些示例代码来说明.
@Path("Things")
//@Stateless //works just fine when em.persist() is called
@RequestScoped //throws transactionrequiredexception when em.persist() is called
public class ThingsResource{
@PersistenceContext(unitName = "persistenceUnitName")
EntityManager em;
public ThingsResource() { }
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response postThing(ThingDTO thing){
ThingEntity newThing = new ThingEntity(thing);
em.persist(newThing);
em.flush();
return Response.created(new URI("/" + newThing.getId()).build();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个jenkins管道,它构建一个java工件,将其复制到一个目录,然后尝试执行外部脚本.
我在管道脚本中使用此语法来执行外部脚本
dir('/opt/script-directory') {
sh './run.sh'
}
Run Code Online (Sandbox Code Playgroud)
该脚本只是一个简单的docker构建脚本,但构建将因以下异常而失败:
java.io.IOException: Failed to mkdirs: /opt/script-directory@tmp/durable-ae56483c
Run Code Online (Sandbox Code Playgroud)
该错误令人困惑,因为该脚本不会创建任何目录.它只是构建一个docker镜像并将新构建的java工件放在该图像中.
如果我在jenkins中创建一个不同的作业,执行外部脚本作为其唯一的构建步骤,然后使用以下语法从我的管道脚本调用该作业:
build 'docker test build'
Run Code Online (Sandbox Code Playgroud)
一切正常,脚本在另一个作业内执行,管道按预期继续.
这是执行工作区外部脚本的唯一方法吗?
我在管道脚本中执行脚本的尝试出了什么问题?