Как использовать Dozer с Spring Boot?

Я работаю над проектом Spring Boot. У меня просто есть конфигурация аннотации. Я хочу включить dozer для преобразования Entities в DTO и DTO в Entities. Я вижу на веб-сайте dozer, они объясняют, что я должен добавить следующую конфигурацию в файл конфигурации spring xml. Поскольку у меня есть не файл xml, а класс Java конфигурации аннотаций, я не знаю, как перевести это в класс конфигурации Java.

<bean id="org.dozer.Mapper" class="org.dozer.DozerBeanMapper">
  <property name="mappingFiles">
    <list>
      <value>dozer-global-configuration.xml</value>
      <value>dozer-bean-mappings.xml</value>
      <value>more-dozer-bean-mappings.xml</value>
    </list>
  </property>
</bean>

Если бы кто-нибудь мог привести мне пример, это будет очень полезно. Спасибо


person Pracede    schedule 06.02.2015    source источник
comment
Почему бы не использовать DozerBeanMapperSingletonWrapper.getInstance()?   -  person Alex78191    schedule 04.09.2019


Ответы (3)


Я думаю, что-то вроде этого должно работать:

@Configuration
public class YourConfiguration {

  @Bean(name = "org.dozer.Mapper")
  public DozerBeanMapper dozerBean() {
    List<String> mappingFiles = Arrays.asList(
      "dozer-global-configuration.xml", 
      "dozer-bean-mappings.xml",
      "more-dozer-bean-mappings.xml"
    );

    DozerBeanMapper dozerBean = new DozerBeanMapper();
    dozerBean.setMappingFiles(mappingFiles);
    return dozerBean;
  }

  ...
}
person micha    schedule 06.02.2015
comment
Спасибо за ваши предложения. Это то, что я делаю. - person Pracede; 06.02.2015

Если вы используете DozerBeanMapperFactoryBean вместо DozerBeanMapper, вы можете использовать что-то вроде этого.

@Configuration
public class MappingConfiguration {

    @Bean
    public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean(@Value("classpath*:mappings/*mappings.xml") Resource[] resources) throws Exception {
        final DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
        // Other configurations
        dozerBeanMapperFactoryBean.setMappingFiles(resources);
        return dozerBeanMapperFactoryBean;
    }
}

Таким образом, вы можете импортировать свои сопоставления автоматически. Чем просто ввести свой Mapper и использовать.

@Autowired
private Mapper mapper;

Обновление с помощью Dozer 5.5.1

В dozer 5.5.1 удален DozerBeanMapperFactoryBean. Итак, если вы хотите использовать обновленную версию, вам нужно сделать что-то вроде ниже,

@Bean
public Mapper mapper(@Value(value = "classpath*:mappings/*mappings.xml") Resource[] resourceArray) throws IOException {
    List<String> mappingFileUrlList = new ArrayList<>();
    for (Resource resource : resourceArray) {
        mappingFileUrlList.add(String.valueOf(resource.getURL()));
    }
    DozerBeanMapper dozerBeanMapper = new DozerBeanMapper();
    dozerBeanMapper.setMappingFiles(mappingFileUrlList);
    return dozerBeanMapper;
}

Теперь введите маппер, как сказано выше.

@Autowired
private Mapper mapper;

И используйте, как показано ниже, пример,

mapper.map(source_object, destination.class);

например. mapper.map(admin, UserDTO.class);

person bhdrkn    schedule 19.10.2015
comment
Поздно на вечеринку, но я не могу найти пакет org.dozer.spring в выпуске Dozer 5.5.1. DozerBeanMapperFactoryBean был заменен/перемещен? - person sMaN; 27.12.2018
comment
@sMaN да, это удалено в Dozer 5.5.1. - person Abhishek; 28.01.2019
comment
Можно немного улучшить, используя: new DozerBeanMapper(mappingFileUrlList) - person DaBlick; 02.12.2019

На всякий случай кто-то хочет избежать файла xml dozer. Вы можете использовать конструктор непосредственно в java. Для меня это путь в контексте аннотации Spring.

Дополнительную информацию см. на странице сопоставление API dozer.

    @Bean
public DozerBeanMapper mapper() throws Exception {
    DozerBeanMapper mapper = new DozerBeanMapper();
    mapper.addMapping(objectMappingBuilder);
    return mapper;
}

BeanMappingBuilder objectMappingBuilder = new BeanMappingBuilder() {
    @Override
    protected void configure() {
        mapping(Bean1.class, Bean2.class)
                .fields("id", "id").fields("name", "name");
    }
};

В моем случае это было более эффективно (по крайней мере, в первый раз). Никаких бенчмарков и прочего не делал.

person Xavier Bouclet    schedule 15.02.2017