# javax.xml.bind.annotation.adapters

***

**1. Adapting a LocalDate to an XMLGregorianCalendar**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class LocalDateAdapter extends XmlAdapter<XMLGregorianCalendar, LocalDate> {

    @Override
    public XMLGregorianCalendar marshal(LocalDate localDate) throws Exception {
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(localDate.getYear(), localDate.getMonthValue(), localDate.getDayOfMonth(), 0, 0, 0, 0, 0);
    }

    @Override
    public LocalDate unmarshal(XMLGregorianCalendar xmlGregorianCalendar) throws Exception {
        return LocalDate.of(xmlGregorianCalendar.getYear(), xmlGregorianCalendar.getMonth(), xmlGregorianCalendar.getDay());
    }
}
```

**2. Adapting a ZonedDateTime to an XMLGregorianCalendar**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class ZonedDateTimeAdapter extends XmlAdapter<XMLGregorianCalendar, ZonedDateTime> {

    @Override
    public XMLGregorianCalendar marshal(ZonedDateTime zonedDateTime) throws Exception {
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(zonedDateTime.getYear(), zonedDateTime.getMonthValue(), zonedDateTime.getDayOfMonth(), zonedDateTime.getHour(), zonedDateTime.getMinute(), zonedDateTime.getSecond(), zonedDateTime.getNano()/1000000, zonedDateTime.getOffset().getTotalSeconds()/3600);
    }

    @Override
    public ZonedDateTime unmarshal(XMLGregorianCalendar xmlGregorianCalendar) throws Exception {
        return ZonedDateTime.of(xmlGregorianCalendar.getYear(), xmlGregorianCalendar.getMonth(), xmlGregorianCalendar.getDay(), xmlGregorianCalendar.getHour(), xmlGregorianCalendar.getMinute(), xmlGregorianCalendar.getSecond(), xmlGregorianCalendar.getMillisecond()*1000000, ZoneOffset.ofHoursMinutes(xmlGregorianCalendar.getTimezone(), xmlGregorianCalendar.getTimezone()));
    }
}
```

**3. Adapting a BigDecimal to a String**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class BigDecimalAdapter extends XmlAdapter<String, BigDecimal> {

    @Override
    public String marshal(BigDecimal bigDecimal) throws Exception {
        return bigDecimal.toString();
    }

    @Override
    public BigDecimal unmarshal(String string) throws Exception {
        return new BigDecimal(string);
    }
}
```

**4. Adapting a Duration to an XMLGregorianCalendarDuration**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DurationAdapter extends XmlAdapter<XMLGregorianCalendarDuration, Duration> {

    @Override
    public XMLGregorianCalendarDuration marshal(Duration duration) throws Exception {
        return DatatypeFactory.newInstance().newXMLGregorianCalendarDuration(duration.toDays(), duration.toHours(), duration.toMinutes(), duration.toSeconds(), duration.getNano()/1000000000);
    }

    @Override
    public Duration unmarshal(XMLGregorianCalendarDuration xmlGregorianCalendarDuration) throws Exception {
        return Duration.ofDays(xmlGregorianCalendarDuration.getDays())
                .plusHours(xmlGregorianCalendarDuration.getHours())
                .plusMinutes(xmlGregorianCalendarDuration.getMinutes())
                .plusSeconds(xmlGregorianCalendarDuration.getSeconds())
                .plusNanos(xmlGregorianCalendarDuration.getFractionalSeconds().intValue()*1000000000);
    }
}
```

**5. Adapting a File to a ByteArray**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class FileAdapter extends XmlAdapter<byte[], File> {

    @Override
    public byte[] marshal(File file) throws Exception {
        return Files.readAllBytes(file.toPath());
    }

    @Override
    public File unmarshal(byte[] bytes) throws Exception {
        File file = File.createTempFile("file", ".tmp");
        Files.write(file.toPath(), bytes);
        return file;
    }
}
```

**6. Adapting a List to an Array**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class ListAdapter<T> extends XmlAdapter<T[], List<T>> {

    @Override
    public T[] marshal(List<T> list) throws Exception {
        return list.toArray(new T[list.size()]);
    }

    @Override
    public List<T> unmarshal(T[] array) throws Exception {
        return Arrays.asList(array);
    }
}
```

**7. Adapting a Map to an Object**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class MapAdapter<K, V> extends XmlAdapter<Object, Map<K, V>> {

    @Override
    public Object marshal(Map<K, V> map) throws Exception {
        return map.entrySet().stream().map(entry -> new Object[]{entry.getKey(), entry.getValue()}).toArray();
    }

    @Override
    public Map<K, V> unmarshal(Object[] objects) throws Exception {
        Map<K, V> map = new HashMap<>();
        for (Object object : objects) {
            Object[] pair = (Object[]) object;
            map.put((K) pair[0], (V) pair[1]);
        }
        return map;
    }
}
```

**8. Adapting an Enum to a String**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class EnumAdapter<T extends Enum<T>> extends XmlAdapter<String, T> {

    private Class<T> enumClass;

    public EnumAdapter(Class<T> enumClass) {
        this.enumClass = enumClass;
    }

    @Override
    public String marshal(T enumValue) throws Exception {
        return enumValue.name();
    }

    @Override
    public T unmarshal(String enumName) throws Exception {
        return Enum.valueOf(enumClass, enumName);
    }
}
```

**9. Adapting a boolean to an int**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class BooleanToIntAdapter extends XmlAdapter<Integer, Boolean> {

    @Override
    public Integer marshal(Boolean bool) throws Exception {
        return bool ? 1 : 0;
    }

    @Override
    public Boolean unmarshal(Integer integer) throws Exception {
        return integer == 1;
    }
}
```

**10. Adapting a Date to an XMLGregorianCalendar**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<XMLGregorianCalendar, Date> {

    @Override
    public XMLGregorianCalendar marshal(Date date) throws Exception {
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(date);
    }

    @Override
    public Date unmarshal(XMLGregorianCalendar xmlGregorianCalendar) throws Exception {
        return xmlGregorianCalendar.toGregorianCalendar().getTime();
    }
}
```

**11. Adapting a URI to a String**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class UriAdapter extends XmlAdapter<String, URI> {

    @Override
    public String marshal(URI uri) throws Exception {
        return uri.toString();
    }

    @Override
    public URI unmarshal(String string) throws Exception {
        return URI.create(string);
    }
}
```

**12. Adapting a URL to a String**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class UrlAdapter extends XmlAdapter<String, URL> {

    @Override
    public String marshal(URL url) throws Exception {
        return url.toString();
    }

    @Override
    public URL unmarshal(String string) throws Exception {
        return new URL(string);
    }
}
```

**13. Adapting an IOException to a String**

```java
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class IOExceptionAdapter extends XmlAdapter<String, IOException> {

    @Override
    public String marshal(IOException exception) throws Exception {
        return exception.getMessage();
    }

    @Override
    public IOException unmarshal(String message) throws Exception {
        return new IOException(message);
    }
}
```

**14. Adapting a MalformedURLException to a String**

```java
import javax.xml.bind.annotation.adapters

```
