Корпоративное приложение Java EE - в Netbeans EJB в веб-службе REST неправильно генерируется автоматически и генерируется исключение NullPointerException - PullRequest
0 голосов
/ 24 октября 2019

Это для школьного проекта. Мне нужно создать приложение 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

Любая помощь по этому вопросу будет принята.

...