Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 如何处理未找到的javax.faces.resource资源_Jsf 2_Primefaces - Fatal编程技术网

Jsf 2 如何处理未找到的javax.faces.resource资源

Jsf 2 如何处理未找到的javax.faces.resource资源,jsf-2,primefaces,Jsf 2,Primefaces,当我从javax.faces.resource键入指向不存在资源的url时,例如 http://myapp/javax.faces.resource/noexisting.xhtml 我正在获取默认的HTTP 404页面,而我的404错误页面未被呈现。我知道FacesServlet正在将状态代码设置为404,而不是发送en error,这就是我的错误页面从未被调用的原因。是否有方法覆盖此实现以发送错误而不是设置状态代码 我使用的是primefaces 3.5和morajara 2.1.14

当我从javax.faces.resource键入指向不存在资源的url时,例如

http://myapp/javax.faces.resource/noexisting.xhtml 
我正在获取默认的HTTP 404页面,而我的404错误页面未被呈现。我知道FacesServlet正在将状态代码设置为404,而不是发送en error,这就是我的错误页面从未被调用的原因。是否有方法覆盖此实现以发送错误而不是设置状态代码

我使用的是primefaces 3.5和morajara 2.1.14


谢谢你的帮助。

我自己找到了解决办法。我实现了自己的ResourceHandler并检查资源是否存在。如果资源不存在,我会发送404错误。 如果其他人也有同样的问题,以下是代码:

package com.mypackage;

import java.io.IOException;
import javax.faces.application.Resource;
import javax.faces.application.ResourceHandler;
import javax.faces.application.ResourceHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import com.sun.faces.util.Util;

public class MyResourceHandler extends ResourceHandlerWrapper {

  // Properties
  // -----------------------------------------------------------------------------------------------------

  private final ResourceHandler wrapped;

  public MyResourceHandler (final ResourceHandler wrapped) {
    this.wrapped = wrapped;
  }

  @Override
  public ResourceHandler getWrapped() {
    return wrapped;
  }


  /**
   * @see javax.faces.application.ResourceHandlerWrapper#isResourceRequest(javax.faces.context.FacesContext)
   */
  @Override
  public boolean isResourceRequest(final FacesContext context) {
    return super.isResourceRequest(context);
  }

  @Override
  public void handleResourceRequest(FacesContext context) throws IOException {
    String resourceId = normalizeResourceRequest(context);
    if (null != resourceId && resourceId.startsWith(RESOURCE_IDENTIFIER)) {
      Resource resource = null;
      String resourceName = null;
      if (ResourceHandler.RESOURCE_IDENTIFIER.length() < resourceId.length()) {
        resourceName = resourceId.substring(RESOURCE_IDENTIFIER.length() + 1);
        if (!StringUtils.isEmpty(resourceName)) {
          resource =
              context
                  .getApplication()
                  .getResourceHandler()
                  .createResource(resourceName,
                      context.getExternalContext().getRequestParameterMap().get("ln"));
        }
      }
      if (resource == null) {
        HttpServletResponse response =
            (HttpServletResponse) context.getExternalContext().getResponse();
        response.sendError(404);
        return;
      }
    }
    super.handleResourceRequest(context);
  }

  private String normalizeResourceRequest(FacesContext context) {

    String path;
    String facesServletMapping = Util.getFacesMapping(context);
    // If it is extension mapped
    if (!Util.isPrefixMapped(facesServletMapping)) {
      path = context.getExternalContext().getRequestServletPath();
      // strip off the extension
      int i = path.lastIndexOf(".");
      if (0 < i) {
        path = path.substring(0, i);
      }
    } else {
      path = context.getExternalContext().getRequestPathInfo();
    }
    return path;
  }


}
package com.mypackage;
导入java.io.IOException;
导入javax.faces.application.Resource;
导入javax.faces.application.ResourceHandler;
导入javax.faces.application.ResourceHandlerWrapper;
导入javax.faces.context.FacesContext;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.commons.lang3.StringUtils;
导入com.sun.faces.util.util;
公共类MyResourceHandler扩展了ResourceHandlerWrapper{
//性质
// -----------------------------------------------------------------------------------------------------
私有最终资源处理器;
公共MyResourceHandler(最终ResourceHandler包装){
this.wrapped=wrapped;
}
@凌驾
公共资源处理程序getWrapped(){
返回包装;
}
/**
*@see javax.faces.application.ResourceHandlerWrapper#isResourceRequest(javax.faces.context.FacesContext)
*/
@凌驾
公共布尔值isResourceRequest(最终FacesContext上下文){
返回super.isResourceRequest(上下文);
}
@凌驾
public void handleResourceRequest(FacesContext上下文)引发IOException{
字符串resourceId=normalizeResourceRequest(上下文);
if(null!=resourceId&&resourceId.startsWith(资源标识符)){
Resource=null;
字符串resourceName=null;
if(ResourceHandler.RESOURCE\u IDENTIFIER.length()
你的意思是这样的吗?不。这是我已经实现的。对于/javax.faces.resource/下不存在的资源,从未调用我的自定义错误页。这是一个很棒的部分。感谢男人@alpha2011!帮了我大忙!但是我想知道,你能告诉我你是从哪里知道的吗:“我知道FacesServlet正在将状态代码设置为404,而不是发送错误,这就是为什么我的错误页面从未被调用的原因。”此外,我编辑了你代码中的一些部分以使用OmniFaces,因为我使用的是MyFaces,而我没有com.sun.faces.util.util