2014-03-27 1 views
0

나는 대부분이 문제를 해결했지만 끝에는 오류 추적을 알 수 없다. 아마 미묘한 일이 될 것이다.이 필드 값을 맵으로 정렬

GSON에 대한 해결 방법을 구현 중입니다. 실제 GSON은 problems parsing nested maps입니다.

public class RegisterValues 
    { 
     int Earth; 
     int Mars; 
      //etc for 200 planets 

       public Map returnValues()throws IllegalArgumentException, SecurityException, IllegalAccessException, NoSuchFieldException{ 
        final String [] fieldValues = new String[] {"Earth", "Mars", //etc } 
        RegisterValues regValues = new RegisterValues(); 

        Map values = new HashMap<String, Integer>(); 
        //values.put("Earth", Earth); manually this works, I'd rather loop through a readymade array of String values. 


        for (String value : fieldValues){ 
          values.put(field, regValues.getClass().getField(field).getInt(field);) //here it breaks 

     } 
     return values; 
      } 
     } 

오류 추적 :

Rebinding example.client.Panel // This is the class that is calling the above function 
02:24:31.704 [DEBUG] Checking rule <generate-with class='com.google.gwtjsonrpc.rebind.RemoteJsonServiceProxyGenerator'/> 
02:24:31.704 [ERROR] Errors in '.../RegisterValues.java' 
02:24:31.704 [ERROR] Line 324: No source code is available for type java.lang.SecurityException; did you forget to inherit a required module? 
02:24:31.704 [ERROR] Line 333: The method getField(String) is undefined for the type Class<capture#1-of ? extends RegisterValues> 

모든 행 번호가 I이 클래스를 호출하는 부분을 참조한다. 수동으로 맵을 채울 때 작동하지만이 루핑 메소드를 수행하면 작동하지 않습니다.

기본적으로 위의 내용이 올바른지 궁금합니다.

(!) 참고 : 위에서 올 바르면,이 때문에이 그 즉 반사 클래스가 즉시 컴파일되어 있기 때문에 이것이 불가능되고 그것을이다 (GWT.create()) 나는이 부분에 액세스하는 경우에만 프로그램 - 따라서 그것은 어떤 문제가 있습니까?

+0

컴파일 가능한 코드를 게시하면 도움이됩니다. –

+0

호환되는 코드 란 무엇입니까? – fiz

+0

기본적으로 문자열을 필드 이름으로 변경하는 것은 내가 원하는 것입니다. – fiz

답변

2

java.lang.SecurityException이 클라이언트 측에 던져지고 있지만 (클라이언트 코드가 자바 스크립트로 교차 컴파일되기 때문에) GWT 클라이언트 측과 호환되지 않습니다. 클라이언트 측 getField(String)를 호출하는 것처럼 보이는 http://www.gwtproject.org/doc/latest/RefJreEmulation.html

:

는 클라이언트 측 코드와 함께 사용할 수있는 자바 클래스의 목록은이 링크를 참조하십시오. 그래서 [ERROR] Line 333이 (가) 발생합니다. 이 코드가 서버 측에 있으면이 클래스의 경로에 .gwt.xml의 항목이 소스 경로로 존재하지 않는지 확인하십시오 (예 : <source path='server' />이 없는지 확인하십시오).

regValues.getClass()을 수행하는 대신 RegisterValues.class을 시도해 볼 수 있습니까? (나는 이것이 차이를 만들지 확실하지 않다)

또한 나는 당신이 성취하려는 것을 확신하지 못한다. 그러나 GWT 클라이언트 측에서 Gson을 사용할 수는 없다. 대신 GWT의 AutoBean 기능을 사용할 수 있습니다 : using Gson library in GWT client code

당신은 서버 측에서 GSON을 사용할 수 있으며,이 Map의 클라이언트 측에서 사용할 수를 생성하지 않는 경우, 사용자 정의 시리얼 라이저 (com.google.gson.JsonSerializer) 및 디시리얼라이저를 쓸 수 있습니다 (com.google.gson.JsonDeserializer)을 사용하여 클라이언트 측에서 사용할 수있는 Map을 빌드하십시오.