Boa noite pessoal, gerei um projeto com Maven pra utilizar wildFly e JSF, mais tarde integrei também o primefaces. Escolhi a opção no maven que gerar as classes de exemplo, testei a comunicação do Rest, e tudo certo. Comecei a desenvolver, mas acontece que minha classe de Login só redireciona se eu não compilar a minha class Rest. OBS.: não estou usando web.xml
CLASSES REST
package br.com.conexaocidadao.conexaocidadao.rest;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.NoResultException;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.ValidationException;
import javax.validation.Validator;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import br.com.conexaocidadao.conexaocidadao.data.MemberRepository;
import br.com.conexaocidadao.conexaocidadao.model.Member;
import br.com.conexaocidadao.conexaocidadao.service.MemberRegistration;
/**
- JAX-RS Example
- This class produces a RESTful service to read/write the contents of the members table.
*/
@Path("/members")
@RequestScoped
public class MemberResourceRESTService {
@Inject private Logger log;
@Inject private Validator validator;
@Inject private MemberRepository repository;
@Inject MemberRegistration registration;
@GET @Produces(MediaType.APPLICATION_JSON) public List<Member> listAllMembers() { return repository.findAllOrderedByName(); }
@GET @Path("/{id:[0-9][0-9]*}") @Produces(MediaType.APPLICATION_JSON) public Member lookupMemberById(@PathParam("id") long id) { Member member = repository.findById(id); if (member == null) { throw new WebApplicationException(Response.Status.NOT_FOUND); } return member; }
/** * Creates a new member from the values provided. Performs validation, and will return a JAX-RS response with either 200 ok, * or with a map of fields, and related errors. */ @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response createMember(Member member) {
Response.ResponseBuilder builder = null;
try { // Validates member using bean validation validateMember(member);
registration.register(member);
// Create an "ok" response builder = Response.ok(); } catch (ConstraintViolationException ce) { // Handle bean validation issues builder = createViolationResponse(ce.getConstraintViolations()); } catch (ValidationException e) { // Handle the unique constrain violation Map<String, String> responseObj = new HashMap<>(); responseObj.put("email", "Email taken"); builder = Response.status(Response.Status.CONFLICT).entity(responseObj); } catch (Exception e) { // Handle generic exceptions Map<String, String> responseObj = new HashMap<>(); responseObj.put("error", e.getMessage()); builder = Response.status(Response.Status.BAD_REQUEST).entity(responseObj); }
return builder.build(); }
/** * <p> * Validates the given Member variable and throws validation exceptions based on the type of error. If the error is standard * bean validation errors then it will throw a ConstraintValidationException with the set of the constraints violated. * </p> * <p> * If the error is caused because an existing member with the same email is registered it throws a regular validation * exception so that it can be interpreted separately. * </p> * * @param member Member to be validated * @throws ConstraintViolationException If Bean Validation errors exist * @throws ValidationException If member with the same email already exists */ private void validateMember(Member member) throws ConstraintViolationException, ValidationException { // Create a bean validator and check for issues. Set<ConstraintViolation<Member>> violations = validator.validate(member);
if (!violations.isEmpty()) { throw new ConstraintViolationException(new HashSet<ConstraintViolation<?>>(violations)); }
// Check the uniqueness of the email address if (emailAlreadyExists(member.getEmail())) { throw new ValidationException("Unique Email Violation"); } }
/** * Creates a JAX-RS "Bad Request" response including a map of all violation fields, and their message. This can then be used * by clients to show violations. * * @param violations A set of violations that needs to be reported * @return JAX-RS response containing all violations */ private Response.ResponseBuilder createViolationResponse(Set<ConstraintViolation<?>> violations) { log.fine("Validation completed. violations found: " + violations.size());
Map<String, String> responseObj = new HashMap<>();
for (ConstraintViolation<?> violation : violations) { responseObj.put(violation.getPropertyPath().toString(), violation.getMessage()); }
return Response.status(Response.Status.BAD_REQUEST).entity(responseObj); }
/** * Checks if a member with the same email address is already registered. This is the only way to easily capture the * "@UniqueConstraint(columnNames = "email")" constraint from the Member class. * * @param email The email to check * @return True if the email already exists, and false otherwise */ public boolean emailAlreadyExists(String email) { Member member = null; try { member = repository.findByEmail(email); } catch (NoResultException e) { // ignore } return member != null; }
}
Configuração REST
package br.com.conexaocidadao.conexaocidadao.rest;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
/**
- A class extending {@link Application} and annotated with @ApplicationPath is the Java EE 7 “no XML” approach to activating
- JAX-RS.
- Resources are served relative to the servlet path specified in the {@link ApplicationPath} annotation.
/
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
/ class body intentionally left blank */
}
Login Controller JSF
package br.com.conexaocidadao.conexaocidadao.controller;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import br.com.conexaocidadao.conexaocidadao.model.Usuario;
// The @Model stereotype is a convenience mechanism to make this a request-scoped bean that has an
// EL name
// Read more about the @Model stereotype in this FAQ:
// http://www.cdi-spec.org/faq/#accordion6
/@Model
@SessionScoped/
@Named
@RequestScoped
public class LoginController {
@Inject private FacesContext facesContext;
/*@Inject private MemberRegistration memberRegistration;*/
@Produces @Named private Usuario usuario;
@PostConstruct public void initNewUsuario() { usuario = new Usuario(); }
public String doLogin() {
try {
//logger.info("Tentando logar com usuário " + login);
//User user = userBO.isUsuarioReadyToLogin(login, senha);
/if (user == null) {
addErrorMessage(“Login ou Senha errado, tente novamente !”);
FacesContext.getCurrentInstance().validationFailed();
return “”;
}/
/Usuario usuario = (Usuario) getUserBO()
.findByNamedQuery(Usuario.FIND_BY_ID, new NamedParams(“id”, user.getId())).get(0);
logger.info(“Login efetuado com sucesso”);/
if(usuario != null && “admin”.equals(usuario.getNome())){
SessionContext.getInstance().setAttribute(“usuarioLogado”, usuario);
}else{
throw new Exception(“Login falhou”);
}
//return “/ConsultaLancamentos?faces-redirect=true”;
return “/restricted/alex?faces-redirect=true”;
} catch (Exception e) {
//addErrorMessage(e.getMessage());
FacesContext.getCurrentInstance().validationFailed();
e.printStackTrace();
return “”;
}
}
public String doLogout() {
//logger.info("Fazendo logout com usuário " + SessionContext.getInstance().getUsuarioLogado().getLogin());
SessionContext.getInstance().encerrarSessao();
//addInfoMessage(“Logout realizado com sucesso !”);
return “/security/login.xhtml?faces-redirect=true”;
}
private String getRootErrorMessage(Exception e) { // Default to general error message that registration failed. String errorMessage = "Registration failed. See server log for more information"; if (e == null) { // This shouldn't happen, but return the default messages return errorMessage; }
// Start with the exception and recurse to find the root cause Throwable t = e; while (t != null) { // Get the message from the Throwable class instance errorMessage = t.getLocalizedMessage(); t = t.getCause(); } // This is the root cause message return errorMessage; }
}
StackTrace
9:55:12,922 WARN [org.jboss.resteasy.core.ExceptionHandler] (default task-14) failed to execute: javax.ws.rs.NotFoundException: Could not find resource for full path: http://localhost:8080/conexaocidadao/restricted/alex.jsf
at org.jboss.resteasy.core.registry.ClassNode.match(ClassNode.java:73) [resteasy-jaxrs-3.0.10.Final.jar:]
at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.java:48) [resteasy-jaxrs-3.0.10.Final.jar:]
at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:444) [resteasy-jaxrs-3.0.10.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:234) [resteasy-jaxrs-3.0.10.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:171) [resteasy-jaxrs-3.0.10.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.10.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.10.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) [resteasy-jaxrs-3.0.10.Final.jar:]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at br.com.conexaocidadao.conexaocidadao.controller.FiltroAutenticacao.doFilter(FiltroAutenticacao.java:39) [classes:]
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_79]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_79]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_79]