2013-07-23 4 views
0

나는 플레이 프레임 워크 1.2.4를 사용하여 애플리케이션에서 WURFL Cloud API를 구현하려고 시도했다. 불행히도, 재생 HttpServletRequest 및 HttpServletResponse HttpServeletRequest 및 HttpServletResponse 캐스팅 할 수있는 요청 및 응답 개체가 있지만 내가 이것을 시도 할 때 NullPointerException .... 할 수있는 하나는 내게 주소를 도울 수 있습니다. 이 문제는 구현에 관해서도 여전히 나을 것입니다. 아래 playframework를 사용하여 java에서 WURFL Cloud API 구현하기

당신이 게시 GitHub의 링크에서 살펴보면 내 코드

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

답변

2

, 그것을 얻는 방법입니다 .. 나는 또한이 모듈 (https://github.com/revbingo/play-wurfl) 보았지만 구현에 관한 정보는 거의가 요청은 다릅니다 : request은 실제로 확장하고있는 Controller 클래스의 보호 된 필드입니다. 그것은 여기에 제시되는 모든의

첫째, 나는 Request.current() 대신 사용하려고 할 것이다 : 당신은 여전히 ​​null 참조를 얻을 경우 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)이 방법을 물려 받았다.