{title:'@Swap Annotation', updated:'8.0.0,9.0.0'}

{@link oaj.annotation.Swap @Swap} can be used to associate a swap class using an annotation. This is often cleaner than using the builder swaps() method since you can keep your swap class near your POJO class.

| @Swap(MyObjectSwap.class) | public class MyPojo { | ... | } | | // Sample swap for converting MyPojo classes to a simple string. | public class MyObjectSwap extends ObjectSwap<MyPojo,String> { | | @Override /* ObjectSwap */ | public String swap(BeanSession session, MyPojo pojo) { | return pojo.toSomeSerializableForm(); | } | }

Multiple swaps can be associated with a class using multiple {@link oaj.annotation.Swap @Swap} annotations:

| @Swap(MyJsonSwap.class) | @Swap(MyXmlSwap.class) | @Swap(MyOtherSwap.class) | public class MyPojo {}

Readers get serialized directly to the output of a serializer. Therefore it's possible to implement a swap that provides fully-customized output.

| public class MyJsonSwap extends ObjectSwap<MyPojo,Reader> { | | public MediaType[] forMediaTypes() { | return MediaType.forStrings("*/json"); | } | | public Reader swap(BeanSession session, MyPojo pojo) throws Exception { | return new StringReader("{message:'Custom JSON!'}"); | } | }

The @Swap annotation can also be used on getters and setters as well to apply a swap to individual property values:

| public class MyBean { | private MyPojo myPojo; | | // Swap applied to bean property. | @Beanp(swap=MyPojoSwap.class) | public MyPojo getMyPojo() { | return myPojo; | } | }

When applied to bean properties, the swap annotation need only be applied to either the getter, setter, or field.

The swap annotation can also be applied to the private field of a bean property, like so:

| public class MyBean { | | @Beanp(swap=MyPojoSwap.class) | private MyPojo myPojo; | | public MyPojo getMyPojo() { | return myPojo; | } | | public MyBean setMyPojo(MyPojo myPojo) { | this.myPojo = myPojo; | return this; | } | }