Redirect com JSF 2.2 não funciona quando tenho compilo Rest WS [RESOLVIDO]

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]

Consegui entender o problema. Eu tinha um filtro servlet também escutando todas requisições no diretório /restricted, quando eu não compilava o filtro, também estava funcionando, daí bastou em renomear o meu diretório restricted para home, e mudar no filtro para “/home”. Dessa forma funcionou! Não entendi bem, mas é como se quando eu estava com filtro o webservice “/rest” estava entrando em conflito com o “/restricted” por começar com os caracteres “rest” também. Enfim se alguém puder explicar isso, seria grato.

RESOLVIDO!

Alex, blza? Estou com o mesmo problema no Struts 2 com RestEasy. Não consigo executar o web service, o Struts está “interceptando” todas as chamadas. Esses filtros que você falou, estão no web.xml?

Vlw