Hy guys,

i found somethin strange with StrutsTypeConverter.
let say i have a converter like this:


//------------------ begin DateConverter class ---------------
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.util.StrutsTypeConverter;

public class DateConverter extends StrutsTypeConverter {
        
        private  String shortDateFormat;
        
        @PostConstruct
        public void loadFormat() {
                this.shortDateFormat = "dd/MM/yyyy";
        }

        @SuppressWarnings("unused")
        @Override
        public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
                
                System.out.println("begin converter");

                if(ArrayUtils.isEmpty(arg1) || StringUtils.isEmpty(arg1[0])) {
                        return null;
                }

                Date date = null;
                
                try {
                        //cek kalo formatnya dd/MM/yyyy hh:mm:ss
                        if(arg1[0].contains(" ")) {
                                this.shortDateFormat = "dd/MM/yyyy hh:mm:ss";
                                date = new 
SimpleDateFormat(shortDateFormat).parse(arg1[0]);
                        }else {
                                date = new 
SimpleDateFormat(shortDateFormat).parse(arg1[0]);
                        }
                }catch (ParseException e) {
                        System.out.println("DateConverter StrutsTypeConverter 
gagal parsing date;");
                        e.printStackTrace();
                }

                System.out.println("end converter");
                return date;
        }

        @Override
        public String convertToString(Map arg0, Object arg1) {

                System.out.println("begin converter to string");
                if(arg1 instanceof Date) {
                        System.out.println("end converter to string");
                        return new 
SimpleDateFormat(shortDateFormat).format((Date) arg1);
                }

                System.out.println("end converter to string");
                return StringUtils.EMPTY;
        }

        
        
}

//------------------ end DateConverter class ---------------



and in my action class, i have 2 property. one of them is Date type. and other 
one is Pojo which one of that Pojo property have a Date type. so my action look 
like this


//------------------ begin MasterPatienAction class ---------------

@Namespace("/patient")
@ParentPackage("app-default")
@Conversion(conversions = {
                @TypeConversion(key = "birthDate", converterClass = 
DateConverter.class)
})
public class MasterPatientAction extends BaseAction {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        private static transient Logger log = 
Logger.getLogger(MasterPatientAction.class);
        
        
        Patient patient;
        List<Patient> listPatient;
        Date birthDate;
        
        @Action(value = "init", results = {
                        @Result(name = "success", location = 
"/pages/pasient-main.jsp"),
                        @Result(name = "error", location = 
"/pages/pasient-main.jsp"),
                        @Result(name = "input", location = 
"/pages/pasient-main.jsp")
        })
        public String init() {
                log.info("begin execute method init");
                
                log.info("end execute method init");
                return SUCCESS;
        }

        @Action(value = "search", results = {
                        @Result(name = "success", location = 
"/pages/pasient-main.jsp"),
                        @Result(name = "error", location = 
"/pages/pasient-main.jsp"),
                        @Result(name = "input", location = 
"/pages/pasient-main.jsp")
        })
        public String search() {
                log.info("begin execute method search");
                
                if(birthDate!=null) {
                        patient.setPatientBirthDate(birthDate);
                }
                
                try {
                        listPasien = service.search(patient);
                } catch (DnaException e) {
                        setMessageError("error caused : "+e.getMessage());
                        return ERROR;
                }
                
                log.info("end execute method search");
                return SUCCESS;
        }

        //--setter getter
}


//------------------ end MasterPatienAction class ---------------


let say my pojo like this:


//------------------ begin Patient pojo class ---------------

public class Patient {
        private integer patientId;
        private String patientName;
        private String patientCode;
        private Date patientBirthDate;

        //setter and getter goes here

}

//------------------ end Patient pojo class ---------------


for the first case, in my JSP, i use struts tag :
<s:textfield name="birthDate" class="form-control form-control-sm text-md 
datepicker" placeholder="Birth Date dd/MM/yyyy"/>

until here, i dont have a problem with it. i can convert my date string (with 
format dd/MM/yyyy e.g 20/01/2021) from JSP to the action class with this step:
1. request /patient/init (to show jsp)
2. insert value in text field with format dd/MM/yyyy e.g 20/01/2021
3. submit with action to /patient/search
4. in action class date converted successful on search method
5. return success from action class
6. text birthDate still the same (e.g 20/01/2021)

here the second case, when i want to convert my date type in my Pojo
so, i change my typeConversion key to : patient.patientBirthDate and also in my 
textfield tag on JSP i change name to patient.patientBirthDate. so this is what 
i change:
1. change key in TypeConvertion annotation to key = "patient.patientBirthDate"
2. change textfield tag in jsp to <s:textfield name="patient.patientBirthDate" 
/>

when i follow step in first case:
1. request /patient/init (to show jsp)
2. insert value in text field with format dd/MM/yyyy e.g "20/01/2021"
3. submit with action to /patient/search
4. in action class date converted successfull
5. return success from action class
6. but my textfield with name patient.patientBirthDate in JSP change to 
"1/20/21" (the value should not change. it should be "20/01/2021") also in my 
console i dont see "begin converter to string" printed which i put in 
convertToString method in converter class.

i use <struts-version>2.5.22</struts-version>

could someone explain to me and how can i fix it.
                                                        


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org

Reply via email to