我正在尝试使用以下结构构建应用程序ear文件:
app.ear
--> lib
-- app-domain.jar
-- app-api.jar
-- app-common.jar
...
--> META-INF
-- application.xml
-- glassfish-application.xml
-- MANIFEST.MF
-- app-ejb.jar
-- app-rs.war
app-api.jar文件包含我的远程接口,如
@Remote
public interface LanguageService {
/**
* @return all languages known to the system
*/
List<Language> loadLanguages();
该实现包含在app-ejb.jar文件中,如下所示:
@Stateless
@Remote(LanguageService.class)
@Path("/language")
public class LanguageServiceImpl extends ValidatingService implements LanguageService {
@PersistenceContext(unitName = "kcalculator")
EntityManager em;
@GET
@Produces("application/json")
@Override
public List<Language> loadLanguages() {
CriteriaQuery<Language> query = createLoadLanguageQuery();
return em.createQuery(query).getResultList();
}
最后我想将它作为JAX-RS Web服务提供,因此我在app-rs.war文件中实现了javax.rs.Application类,如下所示:
@ApplicationPath("/resources")
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(LanguageServiceImpl.class);
return s;
}
此部署没有任何问题,也检测到应用程序类。但是,当我最终访问Web服务时,由于NPE而发生内部服务器错误。
无法查找LanguageServiceImpl,日志包含以下条目:
Caused by: javax.naming.NameNotFoundException: No object bound to name java:module/LanguageServiceImpl!com.kcalculator.ejb.LanguageServiceImpl
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:741)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:715)
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:167)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:471)
... 63 more
因此,该文件被视为Pojo,因此未初始化对实体管理器的引用,最终导致Nullpointer异常。
我有点卡住,因为注释bean类并给它一个映射名称是行不通的。将我的应用程序类放入ejb.jar文件中也无法解决问题。
有谁可以指出我在这里缺少什么?
补充评论: 我在此期间发现的:如果我将一个无状态会话bean添加到我的app-rs.war文件并在MyApplication中注册它,它的工作没有任何问题。注入LanguageService也是如此。因此,问题似乎与服务实现bean类位于另一个工件中有关。
答案 0 :(得分:0)
问题可能是你有一个带有远程接口的EJB。 JAX-RS 1.1在6.2中指出,只需要在无接口bean和本地接口上支持JAX-RS注释:
JAX-RS注释可以应用于bean的本地接口,也可以直接应用于无接口bean。
答案 1 :(得分:0)
如前面的评论之一所示,通过将会话bean移动到Web存档也找到了工作解决方案。因此,ejb .jar文件与包含项目的公开Web服务之间的分离已经消失,但是在工件中提供服务似乎也是合理的,也应该提供Web服务。
感谢提示,但我仍然不清楚(根据规范)为什么最初描述的方法不可行(但我意识到它不是......)。