【问题标题】:Implementing WURFL Cloud API in java using playframework使用 playframework 在 java 中实现 WURFL Cloud API
【发布时间】:2013-07-23 10:52:00
【问题描述】:

我一直在尝试使用播放框架 1.2.4 在我的应用程序中实现 WURFL Cloud API。不幸的是,play 没有 HttpServletRequest 和 HttpServletResponse 仍然有一个 Request 和一个 Response 对象,可以转换为 HttpServeletRequest 和 HttpServletResponse 但是当我尝试这个时,我有一个 NullPointerException .... 可以请帮助我解决这个问题,或者更好地指导我实施。我还查看了这个模块 (https://github.com/revbingo/play-wurfl),但关于它的实现的信息很少..

下面是我的代码sn-p

package controllers;

import play.*;
import play.mvc.*;
import play.mvc.Http.Request;
import play.mvc.Http.Response;
import play.mvc.Http.Header;
import play.server.ServletWrapper;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.scientiamobile.wurflcloud.CloudClientLoader;
import com.scientiamobile.wurflcloud.CloudClientManager;
import com.scientiamobile.wurflcloud.device.AbstractDevice;
import com.sun.xml.internal.ws.client.RequestContext;

import net.sourceforge.wurfl.core.Device;
import net.sourceforge.wurfl.core.WURFLHolder;
import net.sourceforge.wurfl.core.WURFLManager;

import models.*;

public class Application extends Controller {
    private static final String API_KEY = "xxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    public static void index() throws Exception {       
        HttpServletRequest request = (HttpServletRequest) Request.current().args.get(ServletWrapper.SERVLET_REQ);       
        HttpServletResponse response = (HttpServletResponse) Request.current().args.get(ServletWrapper.SERVLET_RES);

        CloudClientLoader loader = new CloudClientLoader(API_KEY);
        CloudClientManager manager = (CloudClientManager) loader.getClientManager();

        try{
            AbstractDevice device = manager.getDeviceFromRequest(request,response);
            Object deviceCapability = device.getCapabilities();

            render(request, response, deviceCapability);
        }catch(NullPointerException ex){
            render(request, response);
        }
    }
}

【问题讨论】:

    标签: java api playframework-1.x wurfl


    【解决方案1】:

    看看你发布的github链接,它获取请求的方式不同:request实际上是你已经扩展的Controller类中的一个受保护字段。

    首先,我会尝试使用它而不是 Request.current(),正如这里建议的那样:https://stackoverflow.com/a/17006963/2617826

    如果您仍然得到一个空引用,请注意HttpServletRequest 是一个接口,因此您可以从 Play Framework play.mvc.Http.Request 编写一个包装器。 WURFL 应该只使用HttpServletRequest.getHeader()HttpServletRequest.getHeaderNames() 方法来执行匹配。 您可以尝试像这样包装play.mvc.Http.Request

    import play.mvc.Http.Request;
    
    class HttpServletRequestWrapper implements HttpServletRequest {
    
        private Http.Request mRequest;
    
        public HttpServletRequestWrapper(Http.Request request) {
            mRequest = request;
        }
    
        public String getHeader(String name) {
            Http.Header header = mRequest.headers.get(name);
            if (header != null) {
                return header.value();
            } else {
                return null;
            }
        }
    
        public Enumeration<String> getHeaderNames() {
            Vector<String> headerNames = new Vector<String>();
            for (String header : mRequest.headers.keySet()) {
                headerNames.add(header);
            }
            return headerNames.elements();
        }
    }
    

    并为所有其他继承的方法返回 null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2016-11-06
      • 2018-02-27
      • 2018-05-02
      相关资源
      最近更新 更多