vendredi 21 août 2015

Spring form:checkbox not working with int and boolean values. Neither BindingResult nor plain target object for bean name 'com' available

*I have looked at other stack over flow suggestions and tried to implement them so please dont mark this as duplicate. i understand the root cause of this is the null value casting issue.

Hi All

I have a spring application where im trying to show a list of check boxes in a jsp like below.

<form:form method="post" modelAttribute="${alertMsgSetting}" id="alertMsgSetting" name="alertMsgSetting" >
                                <dl class="dl-horizontal">
                                    <dt>
                                        <samp>SMS Enabled : &nbsp;&nbsp;</samp>
                                    </dt>
                                    <dd>
                                    <%-- <form:checkbox path="sms_enabled" value="1"/> --%>
                                    <input type="checkbox" name="sms_enabled" value="${sms_enabled}"/>
                                    <input type="hidden" name="_sms_enabled" value="on"/>
                                    </dd>

                                    <dt>
                                        <samp>Email Enabled : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <input type="checkbox" name="sms_settle_enabled" value="sms_settle_enabled"/>
                                    <input type="hidden" name="sms_settle_enabled" value="on"/>
                                    <%-- <form:checkbox path="sms_settle_enabled" value="1"/> --%>
                                    </dd>

                                    <dt>
                                        <samp>2-way SMS Enabled : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <form:checkbox path="sms_enabled"/>
                                    </dd>

                                    <dt>
                                        <samp>SMS Settle Enabled : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <form:checkbox path="sms_settle_enabled"/>
                                    </dd>

                                    <dt>
                                        <samp>SMS Load Enabled : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <form:checkbox path="sms_load_enabled"/>
                                    </dd>

                                    <dt>
                                        <samp>SMS Unload Enabled : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <form:checkbox path="sms_unload_enabled"/>
                                    </dd>

                                    <dt>
                                        <samp>SMS Auth Enabled : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <form:checkbox path="sms_auth_enabled"/>
                                    </dd>

                                    <dt>
                                        <samp>SMS Decline Enabled : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <form:checkbox path="sms_decline_enabled"/>
                                    </dd>

                                    <dt>
                                        <samp>SMS Chargeback Enabled : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <form:checkbox path="sms_chargeback_enabled"/>
                                    </dd>

                                    <dt>
                                        <samp>SMS Promo Enabled : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <form:checkbox path="sms_promo_enabled"/>
                                    </dd>

                                    <dt>
                                        <samp>SMS Flagged for failures? : &nbsp;&nbsp;</samp>
                                    </dt>

                                    <dd>
                                    <form:checkbox path="sms_flagged_for_failures"/>
                                    </dd>

                                    <dt>
                                        <samp><input type="button" value="Update" class="btn btn-primary btn-sm" id="updatebtn3" name="updatebtn3"></input></samp>
                                    </dt>
                                    <dd>
                                        <%-- ${message} --%>
                                    </dd>
                                </dl>
                            </form:form>

Bean class:

package com.nexis.cardholder.orm.model;

public class AlertMessages {
    private int program_id; 
    private String user_token;
    private boolean sms_enabled, sms_settle_enabled, sms_load_enabled, sms_unload_enabled, sms_auth_enabled, sms_decline_enabled, sms_chargeback_enabled, sms_promo_enabled, sms_flagged_for_failures, two_way_enabled, email_alert_enabled; 
    private String start_time, end_time;

    public int getProgram_id() {
        return program_id;
    }
    public void setProgram_id(int program_id) {
        this.program_id = program_id;
    }
    public String getUser_token() {
        return user_token;
    }
    public void setUser_token(String user_token) {
        this.user_token = user_token;
    }

    public String getStart_time() {
        return start_time;
    }
    public void setStart_time(String start_time) {
        this.start_time = start_time;
    }
    public String getEnd_time() {
        return end_time;
    }
    public void setEnd_time(String end_time) {
        this.end_time = end_time;
    }
    public boolean isSms_enabled() {
        return sms_enabled;
    }
    public void setSms_enabled(int sms_enabled) {
        this.sms_enabled = (sms_enabled==1)?true:false;
    }
    public boolean isSms_settle_enabled() {
        return sms_settle_enabled;
    }
    public void setSms_settle_enabled(int sms_settle_enabled) {
        this.sms_settle_enabled = (sms_settle_enabled==1)?true:false;
    }
    public boolean isSms_load_enabled() {
        return sms_load_enabled;
    }
    public void setSms_load_enabled(int sms_load_enabled) {
        this.sms_load_enabled = (sms_load_enabled==1)?true:false;
    }
    public boolean isSms_unload_enabled() {
        return sms_unload_enabled;
    }
    public void setSms_unload_enabled(int sms_unload_enabled) {
        this.sms_unload_enabled = (sms_unload_enabled==1)?true:false;
    }
    public boolean isSms_auth_enabled() {
        return sms_auth_enabled;
    }
    public void setSms_auth_enabled(int sms_auth_enabled) {
        this.sms_auth_enabled = (sms_auth_enabled==1)?true:false;
    }
    public boolean isSms_decline_enabled() {
        return sms_decline_enabled;
    }
    public void setSms_decline_enabled(int sms_decline_enabled) {
        this.sms_decline_enabled = (sms_decline_enabled==1)?true:false;
    }
    public boolean isSms_chargeback_enabled() {
        return sms_chargeback_enabled;
    }
    public void setSms_chargeback_enabled(int sms_chargeback_enabled) {
        this.sms_chargeback_enabled = (sms_chargeback_enabled==1)?true:false;
    }
    public boolean isSms_promo_enabled() {
        return sms_promo_enabled;
    }
    public void setSms_promo_enabled(int sms_promo_enabled) {
        this.sms_promo_enabled = (sms_promo_enabled==1)?true:false;
    }
    public boolean isSms_flagged_for_failures() {
        return sms_flagged_for_failures;
    }
    public void setSms_flagged_for_failures(int sms_flagged_for_failures) {
        this.sms_flagged_for_failures = (sms_flagged_for_failures==1)?true:false;
    }
    public boolean isTwo_way_enabled() {
        return two_way_enabled;
    }
    public void setTwo_way_enabled(int two_way_enabled) {
        this.two_way_enabled = (two_way_enabled==1)?true:false;
    }
    public boolean isEmail_alert_enabled() {
        return email_alert_enabled;
    }
    public void setEmail_alert_enabled(int email_alert_enabled) {
        this.email_alert_enabled = (email_alert_enabled==1)?true:false;
    }



}

Controller class:

public class AlertSettingsController {
    @Autowired
    private AlertsDao alertDao;

    @Autowired
    private UserDao userDao;
    //get alerts page
    @RequestMapping(value = "/alertSettings**", method=RequestMethod.GET)
    public String alerts(HttpServletRequest request, Model m ){
        User u = (User) request.getSession(false).getAttribute("user");
        System.out.println(u.getUser_token()+"::"+u.getProgram_id());
        //get existing values and fill form
        SmsTimings phoneAlertForm = new SmsTimings();

        AlertMessages alertMsgSetting = new AlertMessages();
        alertMsgSetting=alertDao.getAlertMsgSettings(u.getProgram_id(), u.getUser_token());
        m.addAttribute("phoneAlertForm", phoneAlertForm);
        m.addAttribute("alertMsgSetting", alertMsgSetting);
        return "alertSettings";
    }
    @RequestMapping(value = "/alertSettings**", method=RequestMethod.POST)
    public String alertsSave(@ModelAttribute("phoneAlertForm") SmsTimings phoneAlertForm,HttpServletRequest request, Model m ){
        User u = (User) request.getSession(false).getAttribute("user");
        System.out.println(u.getUser_token()+"::"+u.getProgram_id());

        System.out.println(m.toString()+"/n"+phoneAlertForm.getStart()+phoneAlertForm.getEnd()+phoneAlertForm.getTimezone()+ phoneAlertForm.getObserveDayLight());
        //get SMS settings
        if(phoneAlertForm.getStart()!=null){
        String smsSettingStatus=alertDao.smsSettingsUpdate(u.getUser_token(), phoneAlertForm.getStart(), phoneAlertForm.getEnd(), phoneAlertForm.getTimezone());
        m.addAttribute("smsSettingStatus", smsSettingStatus);
        }else{
            String alertSettingStatus=alertDao.alertSettingsUpdate(u.getUser_token());
            m.addAttribute("alertSettingStatus", alertSettingStatus);
        }
        return "alertSettings";
    }
}

DAO method:

public AlertMessages getAlertMsgSettings(int program_id, String user_token) {
        AlertMessages a = new AlertMessages();
        Session  session = sessionFactory.openSession();
        try {
            Query query = session.createSQLQuery("CALL `user_portal`.`Get_Alerts`(:program_id,:userToken)").setParameter("program_id", program_id).setParameter("userToken", user_token);


            List<Object[]> results =   query.list();
            System.out.println(results.get(0)[0]);
            for (Object[] objects : results) {


                a.setProgram_id((int) objects[0]);
                a.setUser_token((String) objects[1]);
                a.setSms_enabled((int) objects[2]);
                a.setSms_settle_enabled((int) objects[3]);
                a.setSms_load_enabled((int) objects[4]);
                a.setSms_auth_enabled((int) objects[5]);
                a.setSms_decline_enabled((int) objects[6]);
                a.setSms_chargeback_enabled((int) objects[7]);
                a.setSms_promo_enabled((int) objects[8]);
                a.setSms_flagged_for_failures((int) objects[9]);
                a.setTwo_way_enabled((int) objects[10]);
                a.setEmail_alert_enabled((int) objects[11]);
                a.setProgram_id((int) objects[12]);
                    a.setStart_time((String) ((objects[13]!=null)?objects[13]:""));
                    a.setEnd_time((String) ((objects[14]!=null)?objects[14]:""));
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
    return a;
    }

Now when i try to 'get' existing info into the form or post updated info to the form, i get an exception saying

Neither BindingResult nor plain target object for bean name 'com' available as request attribute

When i keep the Bean properties as boolean and try to feed int values into it like below, i get a casting exception

a.setProgram_id((int) objects[0]);

because the database (MYSQL) returns an int. I cant change the database.for technical reasons. how do i solve this problem? it has already killed a day of my time and im under some pressure to finish it. I have looked at other stack over flow suggestions and tried to implement them so please dont mark this as duplicate. i understand the root cause of this is the null value casting issue.

Aucun commentaire:

Enregistrer un commentaire