2015-06-02 3 views
1

Я хотел бы поэкспериментировать с добавлением бизнес-логики к объектам данных. Поэтому я хотел бы, чтобы Джексон автоматически вводил контекст приложения Spring для каждого сгенерированного объекта (сгенерированного из JSON).Добавление контекста Spring к генерируемому Jackson объекту

Есть ли способ сказать Джексону добавить контекст Spring для каждого сгенерированного объекта?

+0

Не было бы проще просто сделать это в конструкторе ваших объектов? Таким образом, контекст будет определен и задан, как только объект будет создан, затем Джексон вызовет соответствующие сеттеры для установки значений, считанных из JSON. – Marged

ответ

0

Используйте аннотацию @JacksonInject, чтобы указать, где значения должны поступать от устройства отображения/чтения объектов.

@Test 
public void inject_global_context_object() throws Exception { 
    ContextObject ctx = new ContextObject(); 
    mapper.setInjectableValues(new InjectableValues.Std() 
           .addValue(ContextObject.class, ctx)); 
    DataNeedingContext data = mapper.readValue("{\"prop\":\"foo\"}", 
               DataNeedingContext.class); 
    assertThat(data.ctx, sameInstance(ctx)); 
    assertThat(data.prop, equalTo("foo")); 
} 

@Test 
public void inject_local_context_object() throws Exception { 
    ContextObject ctx = new ContextObject(); 
    DataNeedingContext data = mapper.reader(DataNeedingContext.class) 
      .with(new InjectableValues.Std() 
        .addValue(ContextObject.class, ctx)) 
      .readValue("{\"prop\":\"foo\"}"); 
    assertThat(data.ctx, sameInstance(ctx)); 
    assertThat(data.prop, equalTo("foo")); 
} 

public static class ContextObject { 
} 

public static class DataNeedingContext { 
    private final ContextObject ctx; 
    public String prop; 

    public DataNeedingContext(@JacksonInject ContextObject ctx) { 
     this.ctx = ctx; 
    } 
}