gpt4 book ai didi

java - JAX-RS 使用的无状态 EJB 中的 @Context 注入(inject)

转载 作者:行者123 更新时间:2023-11-30 06:15:14 25 4
gpt4 key购买 nike

我在下面有类似这样的设置。这是一个简化版本,但我认为它传达了基本思想。我正在使用 Jersey 2.16、Java 1.8 和 Glassfish Open Source 4.1

public interface IReportService {
String addNewReport(Report report);
}

@Path("reports")
public class ReportResource implements IReportService {
/**
* Service layer.
*/
@EJB
private transient ReportService service;

@POST
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces(MediaType.TEXT_PLAIN)
@Override
public String addNewReport(final Report report) {
return service.addNewReport(report);
}
}

@Stateless
@LocalBean
public class ReportService implements IReportService {

@EJB
private IReportPersistence reportPersistence;

@Context
SecurityContext secContext;

public String addNewReport(final Report report) {
report.setUserName(secContext.getUserPrincipal().getName());
reportPersistence.persist(report);
}
}

但是当我部署并尝试访问 Web 服务时,我从安全上下文中得到一个 NullPointer 异常。似乎根本没有注入(inject)上下文。我检查了一下,它是 secContext 变量本身,而不仅仅是 getUserPrincipal() 的返回值是 null。 Glassfish 日志中除了我的 NullPointer 之外没有任何警告或异常(这会导致向 Web 客户端返回 500 错误)。

最佳答案

问题是您在错误的地方使用了 SecurityContext。您必须在 REST 资源类中使用它。

您可以尝试以下方法:

@POST
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces(MediaType.TEXT_PLAIN)
@Override
public String addNewReport(final Report report, @Context SecurityContext sc) {
report.setUserName(sC.getUserPrincipal().getName());
return service.addNewReport(report);
}

有关更多详细信息,请查看 Jersey Documentation - Chapter 16. Security .

在 EJB 内部,您必须使用 EJBContext (或 SessionContext )。

关于java - JAX-RS 使用的无状态 EJB 中的 @Context 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29132547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com