Использование Thrift с Java, org.apache.thrift.TApplicationException неизвестный результат

1

Я пытаюсь написать RPC с Thrift, клиент, кажется, прекрасно общается с сервером, и сервер создает список для возврата к клиенту (правильный формат). Но тогда клиент каким-то образом не может распознать пакет, когда я получаю эту ошибку:

org.apache.thrift.TApplicationException: getEntityByIP не удалось: неизвестный результат

Это то, что выглядит мой бережливый файл:

struct EntityLookupMessage{
1: list<i32> entityIDs;
}
service EntityJoinService {
   list<i32> getEntityByIP(1:string IPval,2:i32 date);  
}

И ServerImpl - это следующий метод:

public List<Integer> getEntityByIP(String IPval, int date) throws TException {
    try{
        System.out.println("Checking..."+IPval);
        List<Integer> response=EntityJoinStandalone.getEntityByIP(entityLookup,IPval, date);
        System.out.println(response);
        return response;
    }finally{
        // TODO Auto-generated method stub
    return null
    }

Вызывается клиентом следующим образом:

List<Integer> entity = client.getEntityByIP(IPval, date); 

Есть идеи, почему это так?

Теги:
thrift
rpc
thrift-protocol

1 ответ

3
Лучший ответ

причина

Конструкция не позволяет получить нулевые результаты. Это код сгенерированной функции recv_Xxx():

public List<Integer> recv_getEntityByIP() throws org.apache.thrift.TException
{
  getEntityByIP_result result = new getEntityByIP_result();
  receiveBase(result, "getEntityByIP");
  if (result.isSetSuccess()) {
    return result.success;
  }
  throw new org.apache.thrift.TApplicationException(  
        org.apache.thrift.TApplicationException.MISSING_RESULT, 
        "getEntityByIP failed: unknown result");
}

Вы должны вернуть действительный результат, который...

  • допустимый список, который может быть пустым, но не должен быть null
  • исключение, отправленное на сервер

Решение

Удалите return null из предложения finally.

Лучшая практика

Поместите результат в объект, аналогичный тому, что вы уже делали с аргументами:

struct EntityByIP_result {
  1: list<i32> data;
}

Таким образом, вы также оставляете место для дальнейшего улучшения в будущем, вы можете добавлять новые поля в struct в любое время.

  • 0
    Но список не нулевой. Я печатаю это перед возвращением, и это не нуль. Это [1002].
  • 0
    Я также попробовал ваш обходной путь, та же ошибка.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню