Why are you doing this again?  @SpringBean already takes care of
re-establishing the connection upon deserialization.


On Mon, Jul 28, 2008 at 11:49 AM, Gerald Reinhart
<[EMAIL PROTECTED]> wrote:
>
> I've implemented a little solution to inject SpringBean of Wicket Pages on
> the un-serialization event :
>
> 1 - Make the SpringContext available in a static way :
>
> public class MyWebApplication extends SpringWebApplication {
>
>    private static ApplicationContext springApplicationContext = null ;
>
>        @Override
>          protected void init() {
>                  super.init();
>                  addComponentInstantiationListener(new 
> SpringComponentInjector(this));
>
>                  springApplicationContext = 
> getSpringContextLocator().getSpringContext()
> ;
>
>     (...)
>
>
>        public static ApplicationContext getApplicationContext(){
>                  return springApplicationContext ;
>          }
>
>     (...)
> }
>
>
> 2 - Define an Helper to inspect by introspection your classes in order to :
>   select all transiant fields having a SpringBean and a Required annotation
>   make access to the setter method of the fields (throw all super classes
> of it)
>
>
> public class AnnotatedFieldHelper{
>
>        private Class clazz ;
>
>        private Field field = null;
>
>        private boolean isTransient = false;
>
>        private boolean isSpringBean = false;
>
>        private boolean isRequired = false;
>
>        private String springBeanName = null;
>
>
>    (...)
>
>        /**
>         * Build a list of all transient field of the Class
>         * @param clazz
>         * @return
>         */
>        public static List<AnnotatedField> getTransientAnnotatedField(Class 
> clazz)
> {
>
>                List<AnnotatedField> list = new ArrayList<AnnotatedField>();
>
>               List<Field> fields = new ArrayList<Field>() ;
>
>                // Get all fields (event field from the super classes )
>                Class cl = clazz ;
>                do{
>                        for (Field f : cl.getDeclaredFields()){
>                                fields.add(f) ;
>                        }
>                        cl = cl.getSuperclass() ;
>                }while ( cl != null   ) ;
>
>
>                for (Field f : fields) {
>                        if (Modifier.isTransient(f.getModifiers())) {
>
>                                AnnotatedField af = new AnnotatedField(clazz, 
> f);
>                                af.setTransient(true);
>
>                                Annotation[] annotations = f.getAnnotations();
>                                for (Annotation a : annotations) {
>                                        if (a instanceof SpringBean) {
>                                                af.setSpringBean(true);
>
>                                                SpringBean sb = (SpringBean) a;
>                                                String patternStr =
> "@org.apache.wicket.spring.injection.annot.SpringBean\\(name=(.*)\\)";
>                                                Pattern pattern = 
> Pattern.compile(patternStr);
>                                                Matcher matcher = 
> pattern.matcher("");
>                                                matcher.reset(sb.toString());
>                                                if (matcher.find()) {
>                                                        
> af.setSpringBeanName(matcher.group(1));
>                                                }else{
>                                                        
> af.setSpringBeanName(null);
>                                                }
>                                        }
>                                }
>
>                                String setterName = getSetterName 
> (f.getName());
>                                boolean isRequired = false;
>                                try {
>                                        Method setter = 
> clazz.getMethod(setterName, f.getType());
>                                        Annotation[] annotationsSetter = 
> setter.getAnnotations();
>                                        for (Annotation a : annotationsSetter) 
> {
>                                                if (a instanceof Required) {
>                                                        isRequired = true;
>                                                }
>                                        }
>                                } catch (NoSuchMethodException e) {
>                                        isRequired = false;
>                                } catch (SecurityException e) {
>                                        isRequired = false;
>                                }
>
>                                af.setRequired(isRequired);
>                                list.add(af);
>                        }
>                }
>                return list;
>        }
>
>
> }
>
>
> 3 - Define a super class for all your Wicket Page to serialize all transiant
> SpringBean
>
> public class MySuperPage extends WebPage {
>
>
>        @Override
>        public ApplicationContext getApplicationContext(){
>                return MyWebApplication.getApplicationContext() ;
>        }
>
>
>        /**
>         * Set all transient fields of the page managed by Spring from the 
> spring
>         * context
>         *
>         * @throws RuntimeException
>         */
>        protected void setAllTransientSpringFields() throws RuntimeException {
>
>                List<AnnotatedField> tafList =
> AnnotatedFieldHelper.getTransientAnnotatedField(getClass());
>                for (AnnotatedField af : tafList) {
>                        if (af.isSpringBean() && af.getSpringBeanName() != 
> null) {
>                                try {
>                                        Object bean = 
> getApplicationContext().getBean(af.getSpringBeanName());
>                                        af.getSetter().invoke(this, bean);
>                                } catch (BeansException e) {
>                                        throw new RuntimeException("Impossible 
> to get " +
> af.getSpringBeanName()
>                                                        + " the from the 
> Spring Context");
>                                } catch (Exception e) {
>                                        throw new RuntimeException("Impossible 
> to set " +
> af.getField().getName());
>                                }
>                        }
>                }
>        }
>
>
> 4 - Put transiant all SpringBean not serializable of the Wicket Page and
> define the readObject method using your helper
>
> public class MyPage extends MySuperPage {
>
>  private static final long serialVersionUID = 1L;
>
>        @SpringBean(name = "mySpringBean")
>        transient MyPOJO config;
>
>        @Required
>        public void setMyPOJO(MyPOJO config) {
>                this.config = config;
>        }
>
>  (...)
>
>
>        /**
>         * Creates transient objects
>         * Annotation introspection for all Required transient field
>         */
>        private void readObject(ObjectInputStream stream) throws IOException,
> ClassNotFoundException {
>                stream.defaultReadObject();
>                setAllTransientSpringFields();
>        }
>
>
>
> -----------------------------------------------------------------------------
>
> Some questions ?
>  - Is it a good way do that ?
>  - Is there an existing helper to do that ?
>  - If it's a good way and if ther is no existing helper, can i contrib to
> Wicket ?
>
> Regards,
>
>
> Gerald Reinhart
>
> --
> View this message in context: 
> http://www.nabble.com/%40SpringBean-and-serialization-tp15330505p18691954.html
> Sent from the Wicket - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to