Friday 1 November 2013

Java: @ModelAttribute

Masalah: properties yang tiada element pada .jsp disetkan sebagai null.


Cara mengatasinya adalah menggunakan @ModelAttribute di mana ada 2 jenis yang boleh disemak pada docs spring-framework.

@ModelAttribute pada function akan dipanggil pabila sesuatu model yang serupa pada parameter ditemui.

UPDATE! walaupun tanpa @ModelAttribute("studyLeaveSupervisor") di hadapan StudyLeaveSupervisor dalam parameter @RequestMapping, function pada @ModelAttribute tetap dipanggil.

Jadi kita boleh gunakan function ini untuk dapatkan data daripada DB contohnya. Kemudian data ini akan di-override oleh value pada page.

@ModelAttribute
      /**  
       * Init data daripada DB ke dalam model sebelum di-override oleh data daripada form apabila jumpa parameter yang declared  
       * sebagai <code>@ModelAttribute("studyLeaveSupervisor") </code>. Ini adalah untuk elakkan field yang tiada dalam form di-set value-nya kepada null.  
       * ModelAttribute akan dipanggil sebelum mana-mana RequestMapping yang berkaitan.  
       * @param p2 nama field dalam page  
       * @param slsStudyleaveRefcode nama field dalam page  
       * @param slsSupervisorId nama field dalam page  
       * @return  
       */  
      @ModelAttribute("studyLeaveSupervisor")  
      public StudyLeaveSupervisor preloadStudyLeaveSupervisor( String p2, String slsStudyleaveRefcode, String slsSupervisorId) {  
         if( !StringUtil.isEmpty(slsStudyleaveRefcode) && !StringUtil.isEmpty(p2) && !StringUtil.isEmpty(slsSupervisorId) )  
         {  
                 StudyLeaveSupervisorKey key = new StudyLeaveSupervisorKey();  
                key.setSlsStartDate( DateUtil.parseYYYYMMDDDate( p2 ) );  
                key.setSlsStudyleaveRefcode(slsStudyleaveRefcode);  
                key.setSlsSupervisorId(slsSupervisorId);  
                System.out.println("\t>> loadStudyLeaveSupervisor = " + key.toString() );  
                return studyLeaveService.getSupervisorById(key);  
         }  
         else{  
              return new StudyLeaveSupervisor();  
         }  
      }  

@RequestMapping

      @RequestMapping(method = RequestMethod.PUT)  
      public String update(@ModelAttribute("studyLeaveSupervisor") @Valid StudyLeaveSupervisor studyLeaveSupervisor,   
                BindingResult bindingResult, Model uiModel, HttpServletRequest request, HttpSession session)   
      {  
           MessageObject msj = new MessageObject();  
           try{  
                if (studyLeaveSupervisor != null){  
                     studyLeaveSupervisor.setSlsUpdateDate( new Date() );  
                     studyLeaveSupervisor.setSlsUpdateBy( StringUtil.getString( session.getAttribute( SystemConstant.VAR_SESSION_USERID ) ) );  
                     logger.debug("\tupdate: \tsupervisor = " + studyLeaveSupervisor.toString());  
                     studyLeaveService.updateStudyLeaveSupervisor(studyLeaveSupervisor);  
                }  
                msj = new MessageObject(false, "Successfully update record.", null, studyLeaveSupervisor.getSlsSupervisorId());  
           }catch(Exception e){  
                msj = new MessageObject(true, "Fail to update record.", e.getMessage(), studyLeaveSupervisor.getSlsSupervisorId());  
                e.printStackTrace();  
                uiModel.addAttribute( ViewVariables.VAR_MSJ_GENERIC, msj);  
                return ADD_EDIT_PAGE_URL;  
           }  
           uiModel.addAttribute( ViewVariables.VAR_MSJ_GENERIC, msj);  
           return "redirect:"+LIST_FULLMAPPING;  
      }  

Friday 18 October 2013

JS: Toggle Visibility

<!--
  function toggle_visibility(id, div_id) {
     var e1 = document.getElementById(id);
     var e2 = document.getElementById(div_id);
     
     if(e1.value=='OTHERS')
    e2.style.display='block';
   else
    e2.style.display='none';
  }
  //--> 

Thursday 17 October 2013

Edit launch config server pada STS

Double click server

Click "Open launch configuration"

Tukar config secukup rasa.

Tuesday 3 September 2013

Simple ANT build.xml run in STS

ANT akan memudahkan proses kompil projek ke dalam pakej yang sesuai untuk deployment.
ANT menggunakan satu fail yang lazimnya dinamakan build.xml yang mengandungi arahan salinan fail daripada source-code kepada arkib.
Spring Tool Suite telah mempunyai plug-in yang memudahkan penggunaan ANT.

Right click build.xml
Pilih target yang sesuai, default telah disetkan kepada war di mana *.war akan dihasilkan.
Mesej setelah semua proses selesai.

Boleh rujuk kepada Help dalam STS untuk bantuan menggunakan ANT Support:



Rujukan:


Thursday 18 July 2013

Tipikal STS 3.3.0 Config

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20130521-0416
-product
org.springsource.sts.ide
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-vmargs eclipse -vm c:\jdk6u22\jre\bin\javaw
-Duser.name=developer name
-Dosgi.requiredJavaVersion=1.6
-Xmn512m
-Xms1024m
-Xmx2048m
-XX:PermSize=1024m
-XX:MaxPermSize=2048m

Wednesday 17 July 2013

org.xml.sax.helpers.SecuritySupport12 cannot access its superclass org.xml.sax.helpers.SecuritySupport

Error:


java.lang.IllegalAccessError: class org.xml.sax.helpers.SecuritySupport12 cannot access its superclass org.xml.sax.helpers.SecuritySupport

berlaku ketika cuba run kod di atas Tomcat 7 dengan JDK 1.7

Penyelesaian:

masukkan property metadata-complete="true" dalam web.xml

Contoh:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0" metadata-complete="true">


Rujukan:


Unsupported major.minor version 51.0

Masalah ini didapati ketika cuba run sistem Online.

Environment:

  • Spring Tool Suite (STS 2.9.2)
  • Tomcat 7
  • JDK 1.7
Punca:
  • Class dikompil menggunakan JDK 1.7 manakala Tomcat 7 ketika itu diset untuk gunakan JDK 1.6
Penyelesaian:
  • Set server untuk run gunakan JDK 1.7.

Thursday 6 June 2013

Rename nama deployable guna Maven

Tukar nama projek kod APR kepada 1 nama baru.

Spring Framework 3.05

Langkah2 terlibat:

  1. clean project (MAVEN + compiller)
  2. modify config pada pom.xml
  3. recompile
  4. redeploy
Jika melibatkan port forwarding:
  1. login as root
  2. ke opt/apache/apache2214/conf - modify http config file
  3. ke opt/apache/apache2214/bin
  4. ./apachectl -k restart
Habis.

Tuesday 28 May 2013

Login: SPRING Security 3.0.5 & Stored Procedure

Masalah: login gunakan SPRING Security + Stored Procedure (custom authentication)

Mencabar gak task ni. Sebab dah biasa gunakan config login SPRING Security & LDAP.


Work in progress:

  • cuba guna custom beans + custom filter.
  • daripada docs suruh guna custom AuthenticationProvider

Kajian & rujukan:

Monday 8 April 2013

Webflow: SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'set'.


SEVERE: Servlet.service() for servlet apr threw exception
org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'set'. One of '{"http://www.springframework.org/schema/webflow":attribute}' is expected.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)

Dapat agak error ni sebab salah letak attribut, tapi jenuh jugak la nak cari. Hilang setengah hari.
Rupa2nya sebab ini:


<evaluate expression="studyPlanFrmService.saveStudyPlan(flowScope.studyPlanForm)" result="flowScope.studyPlanform">
<set name="flowScope.msj" value="flowScope.studyPlanForm.formMessage" ></set>
</evaluate>

<set></set> tak boleh diletak dalam <evaluate></evaluate> ???
Tak kisahlah, asal jalan kod aku.



Sunday 7 April 2013

org.apache.commons.lang.time.DateUtils


Tugas hari ini adalah untuk set tarikh berdasarkan bilangan bulan daripada tarikh tertentu

Alhamdulillah, dapati bahwa class di bawah ini mempunyai function yang diperlukan. Tiba masa untuk test.
org.apache.commons.lang.time.DateUtils

Wednesday 27 March 2013

DOJO 1.8: Email validation

... require untuk contoh form di bawah ...
  • "dijit/form/ValidationTextBox", 
  • "dojox/validate/regexp",
  • "dojox/validate/web"
... form ...

 <form:input path="staffAprForm.safEmailAlt"   
      maxlength="99"  
      dojoType="dijit.form.ValidationTextBox"   
      required="true"   
      regExpGen="dojox.validate.regexp.emailAddress"/>&nbsp;  
....
Sila report jika ada isu since solution ni cuba jaya je ni.

... kaedah lain digunakan oleh nakama ...
 <form:input path="staffAprForm.safEmailAlt"    
    maxlength="99"   
    dojoType="dijit.form.ValidationTextBox"    
    required="true"    
    validator="dojox.validate.isEmailAddress"/>&nbsp;  

Friday 15 March 2013

Spring Webflow: cannot found on null

Rasanya dah ada error macam ni sebelum ni, tapi tak jumpa lak post dalam ni.

'spmDesc' cannot be found on null

Punca:

  1. Tak decalre commandName pada <form:form />
  2. Tak initialize object pada form berkenaan
Spekulasi jer semua ni.. mungkin ada faktor lain yang hasilkan error berkenaan.

Sunday 10 March 2013

WebFlow 2.3.0: The event id is required

The event id is required: please set this event's id to a non-blank string identifier

Error biasa jer ni. 
Cer tengok kalau ada clash di antara 3 jenis parameter _eventId, terutama yang menggunakan <hidden />

Saturday 9 March 2013

Spring + JavaScript: id & path property tak konflik

Hari ini hadapi masalah javascript tak detect elemen form yang config guna <form:input />.
Tiada id pada elemen kerana harapkan property path.

path="staffRole.srStaffName" cthnya tidak dijumpai oleh window baru yang dibuka.

Tambah id="srStaffName" membolehkan isu ini diselesaikan.

Persoalannya:
Adakah id ini akan ganggu auto-bind spring/webflow?

Jika ya, maka akan buang lebih banyak masa untuk cari solusi baru.

Parameter jenis java.util.List dalam iBatis 2 SQL Map

Contoh hantar list sebagai parameter dalam sqlmapping iBatis
Contoh ni hantar list dalam 1 parameter map jenis java.util.Map dengan var "p_dept_code_list"
....
 <select id="ims_getSummary" parameterClass="java.util.Map" resultMap="ims_summary_resultMap">  
 select   
  SSL_ANALYSIS_ID, SSL_STAFF_ID, SSL_QUALIFICATION_LEVEL, SSL_UNIVERSITY_NAME, SSL_STUDY_MODE, SSL_DATE_FROM, SSL_DATE_TO,  
  COUNT(SLE_EXTENSION_TYPE) TOTAL_EXTENSION,  
  sm_staff_name staff_name, sm_dept_code dept_code  
 from SSL, SM, SLE  
 where SM_STAFF_ID = SSL_STAFF_ID  
 and SSL_STAFF_ID = SLE_STAFF_ID  
 and SSL_QUALIFICATION_LEVEL = SLE_QUALIFICATION_LEVEL  
 <iterate prepend="AND" open="(" close=")" property="p_dept_code_list" conjunction="OR" >  
 SM_DEPT_CODE=#p_dept_code_list[]#  
 </iterate>  
 group by SSL_ANALYSIS_ID, SSL_STAFF_ID, SSL_QUALIFICATION_LEVEL, SSL_UNIVERSITY_NAME, SSL_STUDY_MODE, SSL_DATE_FROM, SSL_DATE_TO,   
 SM_STAFF_NAME, sm_dept_code  
 order by sm_staff_name, ssl_qualification_level  
 </select>  
....
sql yang dijana mungkin AND ( SM_DEPT_CODE = 'val1' OR SM_DEPT_CODE = 'val2' ....... )

Tuesday 5 March 2013

Spring Webflow: Transition not triggered part 2

1 lagi kes transition not triggered. After a series of try & error, didapati puncanya kerana ada 2 evaluate dalam transition itu.

Kod di bawah merupakan kod yang working selepas diubah.

...
 <transition on="removerd">  
      <!-- <evaluate expression="requestParameters.rdhidid" result="flowScope.selectedRatingDetailId"></evaluate> -->  
      <evaluate expression="ratingFrmService.removeRatingDetailRow( ratingForm, requestParameters.rdhidid )" result="ratingForm"></evaluate>  
 </transition>  
...

logger

protected final Log logger = LogFactory.getLog(getClass());

Tuesday 26 February 2013

Invalid expression: ${SPRING_SECURITY_LAST_EXCEPTION.class.simpleName}

Hari ini nakama report error pada page login /WEB-INF/jsp/login.jsp (line: 90, column: 13)
"${SPRING_SECURITY_LAST_EXCEPTION.class.simpleName}" contains invalid expression(s)


Selepas kaji, dicadangkan bahawa Tomcat7 tak benarkan penggunaan keyword class

Maka tukar kepada
${SPRING_SECURITY_LAST_EXCEPTION['class'].simpleName}

My environment: Tomcat 6
Nakama environment: Tomcat 7

Matikan proses pada port tertentu dalam Windows


Masalah betul apabila nak start server dalam STS IDE, kemudian dia kata port sedang digunakan, padahal pada IDE statusnya offline.
Maka kita matikan saja proses yang sedang gunakan port tersebut.

Thursday 21 February 2013

PL/SQL: Script translate view to create table

Basic script, boleh modify lagi untuk PK, nullable dll.
...
 SELECT ' "' || COLUMN_NAME || '" ' || DATA_TYPE || ' (' || data_length || ' ' || decode(char_used,'B','BYTE') || ') , '  
 FROM user_tab_columns   
 WHERE table_name='TABLE_NAME'  
 ;  

Spring WebFlow, empty value from requestParameters

Hari ni berhadapan dengan isu parameter yang dibaca daripada view tidak ada value.
Error yang terlibat adalah NullPointerException kalau tak silap.

Framework

SPRING WebFlow + JSP

Kod asal:

      <view-state id="view_superviseeStudyPlanListing" view="studyplanfrm/summaryForSVor" model="studyPlanForm">  
           <on-entry>  
                <!-- should have a decision-state to check eligibility -->  
                <!-- load list of supervisee -->  
                <evaluate expression="studyPlanFrmService.loadSummaryForSupervisor(flowScope.studyPlanForm)" result="flowScope.studyPlanForm"></evaluate>  
           </on-entry>  
           <transition on="approval" to="view_studyPlanMainForSupervisor" >  
                <evaluate expression="requestParameters.ssp" result="requestScope.paramStaffStudyPlanCode" />       
           </transition>  
      </view-state>  
      <view-state id="view_studyPlanMainForSupervisor" view="studyplanfrm/studyPlanFrmMain" model="studyPlanForm">  
      <!-- sharing view with view_studyPlanMain -->  
           <on-entry>  
                <!-- load main form with all related contents -->  
                <evaluate expression="studyPlanFrmService.loadMainFormForSupervisor( studyPlanForm, paramStaffStudyPlanCode )" result="flowScope.studyPlanForm" >  
                </evaluate>  
                <set name="flowScope.msj" value="flowScope.studyPlanForm.formMessage" ></set>  
           </on-entry>  
      </view-state>  


Kod terbaru:

      <view-state id="view_superviseeStudyPlanListing" view="studyplanfrm/summaryForSVor" model="studyPlanForm">  
           <on-entry>  
                <!-- should have a decision-state to check eligibility -->  
                <!-- load list of supervisee -->  
                <evaluate expression="studyPlanFrmService.loadSummaryForSupervisor(flowScope.studyPlanForm)" result="flowScope.studyPlanForm"></evaluate>  
           </on-entry>  
           <transition on="approval" to="view_studyPlanMainForSupervisor" >  
           </transition>  
      </view-state>  
      <view-state id="view_studyPlanMainForSupervisor" view="studyplanfrm/studyPlanFrmMain" model="studyPlanForm">  
      <!-- sharing view with view_studyPlanMain -->  
           <on-entry>  
                <evaluate expression="requestParameters.ssp" result="requestScope.paramStaffStudyPlanCode" />       
                <!-- load main form with all related contents -->  
                <evaluate expression="studyPlanFrmService.loadMainFormForSupervisor( studyPlanForm, paramStaffStudyPlanCode )" result="flowScope.studyPlanForm" >  
                </evaluate>  
                <set name="flowScope.msj" value="flowScope.studyPlanForm.formMessage" ></set>  
           </on-entry>  
      </view-state>  


Penyelesaian?

Ermm, selepas pindahkan evaluation untuk requestParameters yang berkenaan semua nampak ok.

Wednesday 13 February 2013

Oracle DB: lsnrctl on Windows


Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\aidy>lsnrctl

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 14-FEB-2013 10:29:38

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> start
Starting tnslsnr: please wait...

TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Production
System parameter file is C:\oracle\product\11.2.0\dbhome_3\network\admin\listener.ora
Log messages written to c:\oracle\diag\tnslsnr\ikcm-110304\listener\alert\log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ikcm-110304)(PORT=1521)))

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Production
Start Date                14-FEB-2013 10:29:54
Uptime                    0 days 0 hr. 0 min. 7 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   C:\oracle\product\11.2.0\dbhome_3\network\admin\listener.ora
Listener Log File         c:\oracle\diag\tnslsnr\ikcm-110304\listener\alert\log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ikcm-110304)(PORT=1521)))
The listener supports no services
The command completed successfully
LSNRCTL>

Friday 8 February 2013

Spring Webflow: Transition not triggered

Isu

Transition not triggered as expected.

Punca

Date validation gunakan JSR. Walaupun flow setup utk mute validation, namun JSR version still checking.
No validation found on the model.
@DateTimeFormat(iso=ISO.DATE, pattern=SystemPattern.INPUT_DATE_PATTERN) has been added and transition flow correctly.

Action

Still working on this issue.
Done with the flow. Required checking on data binding.

Alternative:

Remove the JSR validation?

Not an option since data binding will depends heavily on that validation.

Check if JSR Validation is mutable.


APR

Thursday 7 February 2013

PL/SQL: dba_data_files


Selalu lupa mana letaknya EM? Macam mana nak akses EM untuk modify/view tablespace?
atau prefer guna sqldeveloper/sqlplus

Boleh query gunakan table dba_data_files

SELECT file_name, tablespace_name, ROUND(bytes/1024000) MB
FROM dba_data_files
ORDER BY 1;

desc dba_data_files;

select * from dba_data_files;

alter database datafile
   'imsdata.dbf'
autoextend on;

Wednesday 6 February 2013

Assert: The expression string to parse is required and must not empty

Buang masa juga DEBUG ERROR ni, hanya kerana TRY & ERROR.

 Punca: 

 <display:column>  
      <form:checkbox path="studyPlanDetailList[${spd_rowNum-1}].selected" value="Y" />  
 </display:column>  
 Sepatutnya:

 <display:column>  
      <form:checkbox path="studyPlanDetailList[${spd_rowNum-1}].selected" value="Y">  
 </form:checkbox></display:column>  

Wednesday 30 January 2013

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

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'command' available as request attribute

Penyelesaian:

Sertakan commandName
<form:form name="applyForm" commandName="faForm">

Environment:

Spring Framework, Web Flow

Dev info:

APR