2012-06-03 41 views
4

當我嘗試運行JAX-RS時出現了錯誤消息,我該如何讓它工作? PlayerManagementLocal是ejb的@Local播放器管理工作正常。EJB注入到JAX-RS不起作用

錯誤信息

com.sun.jersey.api.container.ContainerException: An instance of EJB class rest.JSONService could not be looked up using simple form name or the fully-qualified form name.Ensure that the EJB/JAX-RS component implements at most one interface 

jaxrs.java

package rest; 

import javax.ejb.EJB; 
import javax.ejb.Stateful; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.ws.rs.*; 
import javax.ws.rs.core.MediaType; 
import prayForHunt.model.Person; 
import prayForHunt.sb.PlayerManagement; 
import prayForHunt.sb.PlayerManagementLocal; 

@Stateless 
@Path("/json") 
public class JSONService { 

@EJB 
PlayerManagementLocal playerManagement; 



@GET 
@Path("/get/login/{login}/{heslo}") 
@Produces(MediaType.APPLICATION_JSON) 
public String getTrackInJSON(@PathParam("login") String login, @PathParam("heslo") String heslo) { 
    return "ahojky"; 
} 

@GET 
@Path("/get/{param}") 
@Produces(MediaType.APPLICATION_JSON) 
public String getting(@PathParam("param") String msg) { 
    System.out.println(""); 

    if(playerManagement.checkPlayer(msg)){ 
     return "yes"; 
    } 
    return "no"; 
} 
} 

這是代碼,不能想出辦法如何得到它的工作 - 例如....在數據庫中找到的東西,比較它發送到POST/GET服務中的字符串。

playerManagementLocal.java

@Local 
public interface PlayerManagementLocal { 

PlayerDTO getPlayers(String login); 

List<PlayerDTO> getAllPlayers(); 

String getPassword(String login); 

void newPlayer(PersonDTO user, String password); 

void updatePlayer(PlayerDTO player); 

void updatePlayerCard(PlayerCardDTO playerCard); 

public void removePlayer(PlayerDTO player); 

boolean checkPlayer(String login); 

boolean checkPlayer(String login, String password); 

void saveLocation(FavoriteLocationDTO loc); 

List<FavoriteLocationDTO> getPlayerLocations(String login); 

void removeLocation(int id); 
} 

playerManagemet.java

package prayForHunt.sb; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import prayForHunt.DTO.FavoriteLocationDTO; 
import prayForHunt.DTO.PersonDTO; 
import prayForHunt.DTO.PlayerCardDTO; 
import prayForHunt.DTO.PlayerDTO; 
import prayForHunt.model.*; 

/** 
* 
* @author Nell 
*/ 
@Stateless 
public class PlayerManagement implements PlayerManagementLocal { 

@PersistenceContext 
EntityManager em; 

@Override 
public PlayerDTO getPlayers(String login) { 
    Player playerHelp = em.find(Player.class, login); 
    if (playerHelp == null) { 
     return null; 
    } else { 
     return new PlayerDTO(playerHelp); 
    } 
} 

@Override 
public List<PlayerDTO> getAllPlayers() { 
    List<Player> list = (List<Player>) em.createNamedQuery(Player.Q_GET_ALL_PLAYERS).getResultList(); 
    ArrayList<PlayerDTO> listDTO = new ArrayList<PlayerDTO>(); 
    Iterator it = list.iterator(); 
    while (it.hasNext()) { 
     listDTO.add(new PlayerDTO((Player) it.next())); 
    } 
    return listDTO; 
} 

@Override 
public void newPlayer(PersonDTO user, String password) { 
    Player player = user.toPlayer(); 
    player.setPassword(password); 
    PlayerCard card = new PlayerCard(); 
    player.setPlayerCard(card); 
    em.merge(player); 
} 

@Override 
public void updatePlayer(PlayerDTO player) { 
    Player en = em.find(Player.class, player.getLogin()); 
    player.toEntity(en); 
    em.merge(en); 
} 

@Override 
public void updatePlayerCard(PlayerCardDTO playerCard) { 
    PlayerCard en = em.find(PlayerCard.class, playerCard.getCardId()); 
    playerCard.toEntity(en); 
    em.merge(en); 

} 

@Override 
public void removePlayer(PlayerDTO player) { 
    Player en = em.find(Player.class, player.getLogin()); 
    player.toEntity(en); 
    en = em.merge(en); 
    em.remove(en); 
} 

@Override 
public boolean checkPlayer(String login) { 
    Player help = em.find(Player.class, login); 
    if (help != null) { 
     return true; 
    } 
    return false; 
} 


@Override 
public boolean checkPlayer(String login, String password) { 
    Player help = em.find(Player.class, login); 
    if (help != null) { 
     return false; 
    } 
    if (password.equals(help.getPassword())) { 
     return true; 
    } 
    return false; 
} 

@Override 
public String getPassword(String login) { 
    return em.find(Player.class, login).getPassword(); 
} 

@Override 
public void saveLocation(FavoriteLocationDTO loc) { 
    FavoriteLocation en = em.find(FavoriteLocation.class, loc.getId()); 
    if (en == null) { 
     en = new FavoriteLocation(); 
     en.setPlayer(em.find(Player.class, loc.getPlayer())); 
    } 
    en.setLat(loc.getLat()); 
    en.setLng(loc.getLng()); 
    en.setTitle(loc.getTitle()); 
    en.setDescription(loc.getDescription()); 
    em.merge(en); 
} 

@Override 
public List<FavoriteLocationDTO> getPlayerLocations(String login) { 
    Player pl = em.find(Player.class, login); 
    List<FavoriteLocation> list =  em.createNamedQuery(FavoriteLocation.Q_GET_ALL_PLAYERS_LOCATIONS).setParameter("player", pl).getResultList(); 
    ArrayList<FavoriteLocationDTO> listDTO = new ArrayList<FavoriteLocationDTO>(); 
    Iterator it = list.iterator(); 
    while (it.hasNext()) { 
     listDTO.add(new FavoriteLocationDTO((FavoriteLocation) it.next())); 
    } 
    return listDTO; 
} 

@Override 
public void removeLocation(int id) { 
    FavoriteLocation en = em.find(FavoriteLocation.class, id); 
    em.remove(en); 

} 
} 
+0

當我刪除@Stateless比playerManagement爲null。 –

+0

PlayerManagementLocal的代碼是什麼? – toniedzwiedz

+0

我把它編輯成主要文章在這裏。 –

回答

5

遷移從GlassFish的2.1至GlassFish3.1的時候我也遇到過類似的問題。因此,根據下面的鏈接:

https://blogs.oracle.com/sandoz/entry/jersey_glassfish_and_ejbs_as

第1步:創建本地或遠程接口:

@Remote 
@Path("/json") 
public interface JSONServiceRemote 
{ 

    @GET 
    @Path("/get/login/{login}/{heslo}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public String getTrackInJSON(@PathParam("login") String login, @PathParam("heslo") String heslo); 

    @GET 
    @Path("/get/{param}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public String getting(@PathParam("param") String msg) ; 


} 

第二步:現在實現該接口在你無狀態EJB JSONService

@Stateless 
public class JSONService implements JSONServiceInterface 
{ 

    @Override 
    public String getTrackInJSON(@PathParam("login") String login, @PathParam("heslo")  String heslo) 
    { 

    ... 
    } 


    @Override 
    public String getting(@PathParam("param") String msg) 
    { 
     ....... 
    } 

} 
+0

+1謝謝,這是這個問題的正確答案。 – feargal

+0

請注意,我仍然必須執行Jersey servlet的web.xml配置。 – demaniak

+0

使用「遠程」的問題是您需要確保序列化和反序列化您的數據。因此,如果您使用Java EE 7 API中的JsonObject,它將無法工作,因爲它不是可序列化的。 –