在JAX-RS应用程序中无法查找来自其他.jar文件的根资源

时间:2014-07-20 12:26:58

标签: java nullpointerexception jax-rs jndi

我正在尝试使用以下结构构建应用程序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类位于另一个工件中有关。

2 个答案:

答案 0 :(得分:0)

问题可能是你有一个带有远程接口的EJB。 JAX-RS 1.1在6.2中指出,只需要在无接口bean和本地接口上支持JAX-RS注释:

  

JAX-RS注释可以应用于bean的本地接口,也可以直接应用于无接口bean。

答案 1 :(得分:0)

如前面的评论之一所示,通过将会话bean移动到Web存档也找到了工作解决方案。因此,ejb .jar文件与包含项目的公开Web服务之间的分离已经消失,但是在工件中提供服务似乎也是合理的,也应该提供Web服务。

感谢提示,但我仍然不清楚(根据规范)为什么最初描述的方法不可行(但我意识到它不是......)。