Это для школьного проекта. Мне нужно создать приложение Java EE, используя шаблон фасада EJB, который в конечном итоге подключится к клиенту, которого я уже создал.
В моем проекте EJB я создал компонент сеанса без состояния без интерфейса.
@Stateless
@LocalBean
public class TeamFacadeBean {
@PersistenceContext
private EntityManager entityManager;
public List<TeamEJBDTO> getTeams() {
List<TeamsModel> teams;
List<TeamEJBDTO> teamsDto = new ArrayList();
try {
Query query = entityManager.createNamedQuery("TeamsModel.findAll");
teams = query.getResultList();
for (TeamsModel team : teams) {
TeamEJBDTO teamDto = new TeamEJBDTO();
teamDto.setTeamid(team.getTeamid());
teamDto.setName(team.getName());
teamDto.setWins(team.getWins());
teamDto.setLosses(team.getLosses());
teamDto.setTies(team.getTies());
teamsDto.add(teamDto);
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
return teamsDto;
}
}
Я создал сущность, щелкнув правой кнопкой мыши по пакету и выбрав: Создать классы сущностей из базы данных. Это автоматически генерирует мой класс сущностей из источника данных в существующую базу данных.
Я также создал простой класс DTO.
Затем в моем проекте WAR я создаю пакет ресурсов и добавляюкласс, расширяющий Application:
@javax.ws.rs.ApplicationPath("/IcesheetApi")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
addRestResourceClasses(resources);
return resources;
}
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(resources.NewCrossOriginResourceSharingFilter.class);
resources.add(resources.TeamsResource.class);
}
}
Затем я добавляю свою веб-службу RESTful, щелкая правой кнопкой мыши по моему пакету и выбирая: веб-службу RESTful из шаблонов и выбирая простой корневой ресурс в следующем меню.
Здесь я сталкиваюсь со своей проблемой. В этом классе я пытаюсь автоматически сгенерировать EJB, нажав alt + insert и выбрав Call Enterprise Bean. В следующем меню я выбираю мой компонент из проекта EJB. Затем он вставляет следующее:
TeamFacadeBean teamFacadeBean = lookupTeamFacadeBeanBean();
private TeamFacadeBean lookupTeamFacadeBeanBean() {
try {
javax.naming.Context c = new InitialContext();
return (TeamFacadeBean) c.lookup("java:global/IceSheet/IceSheet-ejb/TeamFacadeBean!ejbs.TeamFacadeBean");
} catch (NamingException ne) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
throw new RuntimeException(ne);
}
}
Когда я ожидаю, что оно сгенерирует следующее:
@EJB
private TeamFacadeBean teamFacadeBean;
Вот мой полный класс веб-службы RESTful:
@Path("teams")
public class TeamsResource {
TeamFacadeBean teamFacadeBean = lookupTeamFacadeBeanBean();
@Context
private UriInfo context;
/**
* Creates a new instance of TeamsResource
*/
public TeamsResource() {
}
/**
* Retrieves representation of an instance of resources.TeamsResource
* @return an instance of java.lang.String
*/
@GET
@Produces("application/json")
public List<TeamEJBDTO> getTeamsJson() {
return teamFacadeBean.getTeams();
}
private TeamFacadeBean lookupTeamFacadeBeanBean() {
try {
javax.naming.Context c = new InitialContext();
return (TeamFacadeBean) c.lookup("java:global/IceSheet/IceSheet-ejb/TeamFacadeBean!ejbs.TeamFacadeBean");
} catch (NamingException ne) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
throw new RuntimeException(ne);
}
}
}
Я развернул свое приложение Java EE и при переходе на правильный URI: http://localhost:8080/IceSheet-war/IcesheetApi/teams
я получаю следующую ошибку:
StandardWrapperValve[resources.ApplicationConfig]: Servlet.service() for servlet resources.ApplicationConfig threw exception
java.lang.NullPointerException
at resources.TeamsResource.getTeamsJson(TeamsResource.java:52)
Я не уверен, чтовызывая это NullPointerException, но я думаю, что это как-то связано с моим классом Application?
Я также пытался вручную добавить EJB с аннотацией, но те же результаты.
В качестве отступленияЯ могу создать простой сервлет (щелкнув правой кнопкой мыши по выбору пакета: Servlet), и в этом классе я могу правильно сгенерировать EJB (alt + insert -> Call Enterprise Bean) и увидеть результаты, перейдя к http://localhost:8080/IceSheet-war/TestServlet
Любая помощь по этому вопросу будет принята.