Простое извлечение с использованием Lambdaj приводит к "Невозможно преобразовать заполнитель в ноль" - PullRequest
3 голосов
/ 15 февраля 2012

У меня есть простое pojo:

class UserId {
  String ssn;
  String otsId;
  Integer actorId;

  public UserId(String ssn, String otsId, Integer actorId) {
    this.ssn = ssn;
    this.otsId = otsId;
    this.actorId = actorId;
  }

  @Override
  public String toString() {
    return "[otsId=" + otsId + ", ssn=" + ssn + ", actorId=" + actorId + "]";
  }
}

И я хочу, например, извлечь все значения ssn в List<String> оттуда.Поэтому в качестве примера я пишу:

public class UserIdTest {

  public static void main(String[] args) {
    List<UserId> list = new ArrayList<UserId>();
    list.add(new UserId("111111-1111", "12345678", new Integer(234589235)));
    list.add(new UserId("111111-1111", "12345678", new Integer(234589235)));
    list.add(new UserId("111111-1111", "12345678", new Integer(234589235)));

    getSsnList(list);
  }

  private static List<String> getSsnList(List<UserId> users) { 
    return extract(users, on(UserId.class).ssn); 
  }
}

и LambdaJ выбрасывает:

Exception in thread "main" ch.lambdaj.function.argument.ArgumentConversionException: Unable to convert the placeholder null in a valid argument
at ch.lambdaj.function.argument.ArgumentsFactory.actualArgument(ArgumentsFactory.java:76)
at ch.lambdaj.function.convert.ArgumentConverter.<init>(ArgumentConverter.java:29)
at ch.lambdaj.Lambda.extract(Lambda.java:1035)
at UserIdTest.getSsnList(UserIdTest.java:23)
at UserIdTest.main(UserIdTest.java:20)

Это похоже на очень простую операцию, так чего мне здесь не хватает?

1 Ответ

8 голосов
/ 15 февраля 2012

Lambdaj оборачивает ваши (не финальные) классы с помощью Proxy и перехватывает вызовы METHOD для них.Это означает, что он не может работать с полями, а только с такими методами:

extract(users, on(UserId.class).getSsn());
...