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.
<em>/ @ApplicationPath("/rest") public class JaxRsActivator extends Application { /</em> 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 { <a href="//logger.info">//logger.info</a>("Tentando logar com usuário " + login); //User user = userBO.isUsuarioReadyToLogin(login, senha); /<em>if (user == null) { addErrorMessage(“Login ou Senha errado, tente novamente !”); FacesContext.getCurrentInstance().validationFailed(); return “”; }</em>/ /<em>Usuario usuario = (Usuario) getUserBO() .findByNamedQuery(Usuario.FIND_BY_ID, new NamedParams(“id”, user.getId())).get(0); <a href="http://logger.info">logger.info</a>(“Login efetuado com sucesso”);</em>/ 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() { <a href="//logger.info">//logger.info</a>("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: <a href="http://localhost:8080/conexaocidadao/restricted/alex.jsf">http://localhost:8080/conexaocidadao/restricted/alex.jsf</a> 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]