Два экземпляра ObjectMapper - PullRequest
1 голос
/ 16 октября 2019

Есть ли способ создать два экземпляра ObjectMapper для разных целей.

Модифицированный ObjectMapper

    @Component
    class MyObjectMapper extends ObjectMapper{
      public MyObjectMapper(){
        super();
      }

    public MyObjectMapper(MyObjectMapper om) {
        super(om);
     }

    @Override
    public MyObjectMapper copy() {
        return new MyObjectMapper(this);
     }
   }

Теперь используйте его следующим образом

@Autowired ObjectMapper objectMapper; //performs standard serialization
@Autowire MyObjectMapper myMapper; //i can add custom filters in thiis mapper.

Я попробовал аналогичную настройку, но пользовательский преобразователь фактически влияет на исходный преобразователь rest controllers throw JSON parse error: Unrecognized field

Редактировать: Не уверен, что этот момент очень важен, новсе еще добавляю его использую spring-boot-starter-json

Ответы [ 2 ]

3 голосов
/ 16 октября 2019

И это именно то место, где вы должны использовать аннотацию @Qualifier.

Эта аннотация может использоваться в поле или параметре в качестве квалификатора для потенциальных бинов при автопроводке. Он также может использоваться для аннотирования других пользовательских аннотаций, которые затем могут использоваться в качестве квалификаторов.

0 голосов
/ 17 октября 2019

OK. В сочетании с Ответом от Аникет выяснил, в чем дело, и все еще ищет более подробное объяснение.

Вместо создания экземпляра ObjectMapper как new ObjectMapper(). Сборка с Mapper исправлена.

Итак, два имеют несколько экземпляров ObjectMapper

@Primary
@Bean
public ObjectMapper objectMapper(){
   return new Jackson2ObjectMapperBuilder()
                .build();
}

@Bean("customMapper")
public ObjectMapper customMapper(){
  ObjectMapper customMapper = new Jackson2ObjectMapperBuilder().build();
     mapper.<your customization , filters, providers etc;>
     return mapper;
}

. @Primary будет использоваться во всех случаях по умолчанию, т.е. когда вы просто @Autowire или сериализация по умолчанию, применяемая к вашему телу ответа / запроса вашим контроллером.

Чтобы использовать пользовательский сопоставитель, явно используйте с идентификатором компонента.

@Autowired @Qualifier("customMapper") ObjectMapper mapper;
...