2015-04-22 2 views
1

У меня есть следующие классы и когда я использовал Бульдозер Bean Mapper для преобразования ProductEntity в Product, и наоборот:Как преобразовать URL-адрес с помощью Dozer bean Mapper?

public class ProductEntity(){ 
    private String name; 
    private String description; 
    private URL site; 
} 

public class Product(){ 
    private String name; 
    private String description; 
    private URL site;   
} 

Я получаю следующее сообщение об ошибке:

Internal error [java.lang.NoSuchMethodException: java.net.URL.<init>()

ли бульдозер несовместима с этим URL класс, или я делаю что-то неправильно?

+0

Мы исходим из того, что у вас есть методы 'public' accessor (getters/seters) для каждого из ваших свойств, не так ли? - Кроме того, вы могли бы поделиться файлом отображения .xml' (если есть) – ochi

+0

@ochi Да, у меня есть все публичные аксессоры .... но я не могу найти map.xml – Phopes

+0

@MrPaulHenry - weird! Можете ли вы поделиться, как вы делаете картографирование? – ochi

ответ

1

Прошло много времени с тех пор, как я сделал Dozer, но причина, по которой вы это видите, связана с тем, как Dozer отображает объекты. Он ищет, чтобы создать новый объект, просто вызвав конструктор no-arg, и поскольку URL не имеет одного, вот почему вы получаете это исключение.

Способ создания преобразования идентичности: сопоставить один экземпляр объекта с тем же типом объекта.

, как мы делаем это в 2-х частей:

Во-первых, объявить о пользовательской конфигурации в файле dozer.xml.

<configuration> 
    <custom-converters> 
     <converter type="com.stackoverflow.URLConverter"> 
      <class-a>java.net.URL</class-a> 
      <class-b>java.net.URL</class-b> 
     </converter> 
    </custom-converters> 
</configuration> 

Далее создайте новый URLConverter класс, который простирается от DozerConverter. Причина, по которой она распространяется от DozerConverter, а не CustomConverter, предназначена для простоты и безопасности типов.

public class URLConverter extends DozerConverter<URL, URL> { 

    public URLConverter() { 
     super(URL.class, URL.class); 
    } 

    @Override 
    public URL convertTo(URL source, URL destination) { 
     URL result = null; 
     try { 
      result = source.toURI().toURL(); 
     } catch (MalformedURLException | URISyntaxException e) { 
      throw e; 
     } 

     return result; 
    } 

    @Override 
    public URL convertFrom(URL source, URL destination) { 
     URL result = null; 
     try { 
      result = source.toURI().toURL(); 
     } catch (MalformedURLException | URISyntaxException e) { 
      throw e; 
     } 

     return result; 
    } 
} 

Процесс здесь довольно механически:

  • Попытка преобразовать URL в URI, а затем преобразовать его обратно в URL.
  • Если у вас есть некорректность с URI или URL-адресом, отбросьте его обратно - мы не должны иметь дело с неправильным URL-адресом в этом состоянии в любом случае.
  • В противном случае верните результат преобразованного URL-адреса.
Смежные вопросы