如何使用 jax-rs 子资源定位器处理持久性上下文(EntityManager)?

2024-04-25

我在我的应用程序中使用 jax-rs Restful Web 服务和子资源定位器。但是,将entityManager 传递给子资源后,我无法在此子资源中保留任何新对象。

然而,entityManager 允许我查询它的数据。

这是我的主要资源:

@Path("/registrations")
@Stateless
public class RegistrationsResource {

    @Context
    private UriInfo context;

    @PersistenceContext(unitName="pctx")
    private EntityManager em;

    public RegistrationsResource() {
    }

    //POST method ommited

    @Path("{regKey}")
    public RegistrationResource getRegistrationResource(@PathParam("regKey")
    String regKey) {
        return RegistrationResource.getInstance(regKey, em);
    }

}

这是我的子资源:

public class RegistrationResource {

    private String regKey;
    private EntityManager em;

    private RegistrationResource(String regKey, EntityManager em) {
        this.regKey = regKey;
        this.em = em;
    }

    @Path("securityQuestion")
    @GET
    public String getQuestion() {
        return "iamahuman"+regKey;
    }

    @Path("securityQuestion")
    @POST
    public void postSecurityAnswer(String answer) {
        if(!answer.equals("iamahuman"+regKey)){
            throw new WebApplicationException(Status.BAD_REQUEST);
        }

        //Getting this information works properly
        List<RegistrationEntity> result = em.createNamedQuery("getRegistrationByKey")
            .setParameter("regKey", regKey).getResultList();

        switch(result.size()){
            case 0 :
                throw new WebApplicationException(Status.NOT_FOUND);
            case 1:
                break;
            default:
                throw new WebApplicationException(Status.INTERNAL_SERVER_ERROR);
            }

            RegistrationEntity reg = result.get(0);
            UserEntity newUser = new UserEntity();

            newUser.setHashedPassword(reg.getPwHash(), reg.getSalt());
            newUser.setUsername(reg.getUsername());
            newUser.setName(reg.getName());
            newUser.setSurname(reg.getSurname());

            //CRASHES HERE
            em.persist(newUser);
    }
}

正如您所看到的,它从数据库中获取注册对象,创建新用户进行注册并尝试保留它。但是,em.persist(newUser) 会抛出 TransactionRequiredException。

我的问题是:我应该如何将 EntityManager 传递给子资源,以便它可以正确保留新对象?


抱歉再次挖掘这个问题,但我建议如下:

  • 还将子资源注释为 @Stateless EJB
  • 将 @EJB 注入成员字段放入父资源类中,如下所示:
    
    
        @EJB private RegistrationResource registrationResource;
      
  • 在“getRegistrationResource()”中,不调用子资源的构造函数,而是返回注入的EJB引用:
    
    public RegistrationResource getRegistrationResource() {
        return this.registrationResource;
    }  

但是,要实现此功能,您不能将“@PathParam”作为构造函数参数传递。您必须通过“@Context”或另一个@Path 声明在子资源中单独访问它。
这使您能够以与父资源中完全相同的方式将 EntityManager 注入子资源中,而无需将其传递。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 jax-rs 子资源定位器处理持久性上下文(EntityManager)? 的相关文章

随机推荐

  • 获取个人资料的 Facebook 创建日期[重复]

    这个问题在这里已经有答案了 是否可以通过使用 Graph API 获取 Facebook 个人资料的创建日期 时间 我需要它来建立一个身份验证机制 该机制不允许刚刚创建的 Facebook 用户 调用 Facebook API 是一个 相对
  • 找不到主要出口来加载“XYZComponent”

    我在 Net MVC 组件中加载了 ng2 代码 但控制台中显示以下错误 异常 未捕获 承诺 错误 找不到加载 UsersComponent 的主要出口 错误 找不到加载 UsersComponent 的主要出口 知道可能是什么问题吗 我正
  • Ruby On Rails 更新 Heroku 动态路由

    我有一个使用应用程序范围的 slugs 的应用程序 使用懒惰的宝石 https github com RISCfuture slugalicious与 Sluggable 表 并使用以下代码路由到这些 slugs Slugs begin S
  • 在 Fluent nHibernate 中使用派生类

    我有两个共享公共字段的表 我不想重新映射所有这些 而是 希望拥有一个具有公共字段的基类 对于 POCO 来说这很简单 class Base public string commonField get set class Derived Ba
  • 如何在 C# 中读取文本文件并将数据添加到 int 数组中?

    我正在尝试读取一个文本文件 其中包含以逗号分隔的数字 当我阅读时使用File Readline 我把它拿到string 我需要将其转换为 int 数组 但它给出了错误 文本文件的内容 146429 143689 144380 141523
  • 将 unicode 对象转换为带有实体的拉丁字符串

    我有一个 unicode 对象 例如 x u a 日本語 en i hall le 并希望将其转换为带有 h tml entities 的 latin 1 字符串 例如 a amp 26085 26412 35486 en 269 i ha
  • C/C++ stdlib 命名约定的名称?

    我想知道 C C 标准库中使用的命名约定是否有一个名称 或者至少有一个可以查找规则的备忘单 例如 push back underscore used setstate but not used here string npos when t
  • 没有 id 或名称的 Spring bean

    我正在审查一些 Spring 代码 并且看到一些没有 id 或名称的 bean def 做这件事的人不在场 无法询问 该应用程序运行良好 我不知道这必然意味着什么 有人知道这是否有什么特别的含义吗 某些 Bean 不需要由上下文文件中的其他
  • Spring SAML 扩展和 Spring Security CSRF 保护冲突

    我们有一个带有 Spring Security 3 2 4 的 Spring MVC 4 0 5 应用程序 其中包括运行良好的 CSRF 保护 我们现在添加 SAML 安全扩展 spring security saml2 core 1 0
  • 如何在 JSTL 中设置 cookie

    我正在尝试实现以下目标 但不确定是否可能以及语法应该是什么
  • Python:运行所有子目录中的脚本

    我是Python新手 我正在用它来做一些数据分析 我的问题如下 我有一个包含许多子目录的目录 每个子目录都包含大量数据文件 我已经编写了一个 Python 脚本 当在这些子目录之一中执行时 该脚本会执行数据分析并将其写入输出文件 该脚本包含
  • 在 Postgres 中将数组转换为行

    如果我在 SQL 语句中有类似的内容 A B C 如何将其转换为具有多行的列 如下所示 col A B C 我无法更改该字符串的创建方式 因为它是从外部程序注入到 SQL 查询中的 例如 我不能将其作为 A B C 用方括号替换 我可以把任
  • 无法通过 WSO2 API Manager 中的自定义中介流中的呼叫中介器

    在 WSO2 AM 1 10 中创建自定义中介流以实现 API 链接 作为第一步 我创建了此流程作为测试 它调用 REST 服务以生成令牌并将响应返回给客户端
  • Java Swing 组件中的 HTML 标签

    向 Swing 组件 例如 JLabels 添加 HTML 标签是否会使 JFrame 的渲染速度变慢 我的意思是 Swing 组件中 HTML 渲染的性能如何 是的 这取决于你的 html 的复杂程度 实际上 当你的 jlabel 中有
  • jquery 自动完成不响应动态插入的元素

    我们正在研究使用 jquery 动态插入元素的自动完成 之前对静态元素进行过自动完成 下面是插入一个自动完成添加元素的 html 源代码 同一页面上可能插入多个元素 插入元素的 id 在插入之前是未知的 id 因元素而异
  • 在 jupyter 中 for 循环播放音频

    我有大量需要注释的训练数据 为了做到这一点 我需要听一堆声音片段并记下我听到的内容 我在笔记本上为此写了一个小脚本 我的主要问题是 IPython 显示不循环显示 举个例子 import numpy import IPython displ
  • 在没有活动的情况下启动应用程序,我的广播接收器不工作

    在我的应用程序中 我有一个广播接收器 用于捕获发送到手机的消息
  • Observer() 的结果似乎没有考虑 PyEphem 中的海拔影响

    我对 PyEphem 模块给出的与 Observer 查询相关的结果以及海拔的影响进行了查询 我从几个来源了解到 例如http curious astro cornell edu question php number 388 http c
  • 如何在 Spring MVC 中执行自定义验证?

    我有以下代码 允许用户更新姓名和年份 Model Entity public class Person implements Serializable private static final long serialVersionUID 1
  • 如何使用 jax-rs 子资源定位器处理持久性上下文(EntityManager)?

    我在我的应用程序中使用 jax rs Restful Web 服务和子资源定位器 但是 将entityManager 传递给子资源后 我无法在此子资源中保留任何新对象 然而 entityManager 允许我查询它的数据 这是我的主要资源