Cristian,
Parce que ServletFilter sera toujours appelée avant FacesServlet, vous obtiendrez toujours null.
donc ne pas utiliser
private @In FacesContext facesContext;
plus lors de l'utilisation du filtre Servlet.
Solution: Eh bien, il ne peut pas être la meilleure solution, mais il résout ce que vous voulez faire
Créer une CustomAuthenticationFilter comme suit
@Scope(APPLICATION)
@Name("org.jboss.seam.web.authenticationFilter")
@Install(value = false, precedence = BUILT_IN)
@BypassInterceptors
@Filter(within = "org.jboss.seam.web.exceptionFilter")
public class CustomAuthenticationFilter extends org.jboss.seam.web.AbstractFilter {
/**
* Because of some private methods defined in AuthenticationFilter
* do Ctrl + C/Ctrl + V All of source code of AuthenticationFilter
*
* Except authenticate method which is shown bellow
*/
private void authenticate(HttpServletRequest request, final String username) throws ServletException, IOException {
new ContextualHttpServletRequest(request) {
@Override
public void process() throws ServletException, IOException, LoginException {
Identity identity = Identity.instance();
identity.getCredentials().setUsername(username);
try {
identity.preAuthenticate();
/**
* Yes, THE SAME LOGIC performed by authenticate-method must goes here
*/
/**
* Do not use @In-jection here
*
* Use context lookup instead
* For instance, UserService userService = (UserService) Contexts.lookupInStatefulContexts("userService");
*/
identity.postAuthenticate();
} finally {
// Set password to null whether authentication is successful or not
identity.getCredentials.setPassword(null);
}
}
}.run();
}
}
remplace maintenant par défaut AuthenticationFilter dans/WEB-INF /componets.xml
<web:rewrite-filter view-mapping="/resource/rest/*"/>
<component name="org.jboss.seam.web.authenticationFilter" class="br.com.ar.seam.CustomAuthenticationFilter">
<property name="urlPattern">/resource/rest/*</property>
<property name="authType">basic</property>
</component>
Et Pour activer restURL procédez comme suit
web.xml
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!--HERE GOES NON-REST INTERCEPTED URL-->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.seam</url-pattern>
</servlet-mapping>
<!--HERE GOES REST INTERCEPTED URL-->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Maintenant, supposons que vous voulez appeler /ressources/repos/utilisateur qui servlet-mapping matchs restURL. Dans /WEB-INF/pages.xml déclare
<page view-id="<VIEW_ID_GOES_HERE>">
<rewrite pattern="/resource/rest/user"/>
<rewrite pattern="/resource/rest/{userId}"/>
<!--userId comes from pattern shown above-->
<param name="userId" value="#{userService.userId}"/>
</page>
Pour éviter FacesServlet intercepter une des ressources côté client tels que les fichiers CSS, JAVASCRIPT et images, vous pouvez définir
<servlet>
<servlet-name>Seam Resource Servlet</servlet-name>
<servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Seam Resource Servlet</servlet-name>
<url-pattern>/resource/*</url-pattern>
</servlet-mapping>
qui -t non applicable Cycle de vie JSF. Assurez-vous que place la servlet de ressource Seam au-dessus de la déclaration FacesServlet.
Jetez un oeil à http://stackoverflow.com/questions/2453746/jboss-seam-enabling-debug-page-on-weblogic-10-3-2-11g/2459795#2459795 Et assurez-vous que votre application est emballé correctement. –
Vérifié mais il semble ok ... et le problème persiste .... :( –