我有类似下面的设置。这是一个简化版本,但我认为它传达了基本思想。我正在使用 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 异常。看起来上下文根本没有被注入。我检查了一下,发现是 secContext 变量本身,而不仅仅是 getUserPrincipal() 的返回值为空。除了我的 NullPointer 之外,Glassfish 日志中没有任何警告或异常(这会导致向 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 文档 - 第 16 章. 安全性.
在 EJB 内部,您必须使用EJBContext(或者SessionContext).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)