簡體   English   中英

使用playframework在java中實現WURFL Cloud API

[英]Implementing WURFL Cloud API in java using playframework

我一直在嘗試使用play framework 1.2.4在我的應用程序中實現WURFL Cloud API。 不幸的是,play沒有HttpServletRequest和HttpServletResponse但是有一個Request和一個Response對象可以強制轉換為HttpServeletRequest和HttpServletResponse但是當我嘗試這個時,我有一個NullPointerException ....任何人都可以幫我解決這個問題或者更好地指導我實施。 我也查看了這個模塊( https://github.com/revbingo/play-wurfl )但是關於它的實現的信息很少。

下面是我的代碼片段

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);
        }
    }
}

看一下你發布的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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM