Внедрение play.Environment в сериализатор Джексона с помощью Guice - PullRequest
0 голосов
/ 06 февраля 2020

Jackson 2.10.1, Guice 4.2.2, Play 2.7.2

Я пытаюсь вставить объект play.Environment в пользовательский сериализатор Jackson, например:

@Singleton
public class PathSerializer extends StdSerializer<Path> {

  @Inject
  Environment environment;

  public PathSerializer() {
    this(null);
  }

  public PathSerializer(Class<Path> t) {
    super(t);
  }

  @Override
  public void serialize(Path value, JsonGenerator generator, SerializerProvider provider) throws IOException {
    Path path = environment.rootPath().toPath().relativize(value.toAbsolutePath());
    generator.writeString(path.toString());
  }
}

Однако при вызове этого сериализатора выдается NullPointerException, поскольку environment равно null.

Этот пользовательский сериализатор вызывается с помощью аннотации @JsonSerialize(using = PathSerializer.class). Насколько я понимаю, когда этот сериализатор инициализируется, им управляет Джексон, а не Guice, поэтому среда не может быть внедрена, поскольку PathSerializer не является управляемым компонентом Guice.

Используя Spring, кажется, вы можете используйте аннотацию @Configurable согласно this . Но, похоже, нет эквивалента Play.

Как мне это сделать?

1 Ответ

0 голосов
/ 07 февраля 2020

В конце концов я решил избавиться от игры. Окружение и получить базовый путь с String base = new File(".").getCanonicalPath();, что намного проще. Тогда я релятивизировал это с String relative = new File(base).toURI().relativize(new File(value.toString()).toURI()).getPath();

...