Wednesday 26 December 2012

Object Date tidak bind apabila guna dijit.form.DateTextBox

Perkara ini terjadi dalam Spring 3.05.
Apabila ada data daripada model, tidak display pada view apabila gunakan dijit.form.DateTextBox.
Perkara ini tidak terjadi pada textbox biasa di mana binding  (input/output) ke model nampak ok.

Punca:

Mungkin kerana tidak menggunakan Spring.addDecoration sebaliknya menggunakan property dojo pada element html.

Penyelesaian:

Setakat ini menggunakan Spring.addDecoration nampak ok.

Perkara berkaitan:

Spring-js-resources perlu ditambah kerana perlukan Spring.js dan SpringDojo.js
Sekarang guna spring-js-resources-2.3.0

Langkah-langkah yang telah diambil:
  1. lib DOJO 1.8.0 telah dipindahkan ke META-INF/web-resources/
  2. xxx-servlet.xml telah diubah untuk membenarkan carian pada classpath/resources

Dev info:

Codename APR
Spring 3.05
Dojo 1.8.0

DOJO 1.7 + Spring 3.05 config

fuiyo, masalah pulak dengan Dojo ni.

Hari ini belajar macam mana nak guna static file daripada jar.

Config dalam xxx-servlet.xml
      <!-- Turns on support for mapping requests to Spring MVC @Controller methods   
           Also registers default Formatters and Validators for use across all @Controllers -->  
      <mvc:annotation-driven />  
      <!-- Handles HTTP GET requests for /resources/** by efficiently serving   
           up static resources -->  
      <mvc:resources location="/, classpath:/META-INF/web-resources/" mapping="/resources/**" />  

Kemudian import
 <spring:url value="/scripts/dojo-release-1.8.0/dojo/dojo.js" var="dojo_url" />  
 <spring:url value="/scripts/dojo-release-1.8.0/dijit/themes/claro/claro.css" var="claro_url" />  
 <spring:url value="/app/resources/spring/Spring.js" var="spring_url" />  
 <spring:url value="/app/resources/spring/Spring-Dojo.js" var="spring_dojo_url" />  
 <!-- dojo -->  
 <script src="${dojo_url}" type="text/javascript" data-dojo-config="isDebug: true,parseOnLoad: true" />  
 <script src="${spring_url}" type="text/javascript" ><!-- /required for FF3 and Opera --></script>  
 <script src="${spring_dojo_url}" type="text/javascript"><!-- required for FF3 and Opera --></script>  
 <script type="text/javascript">  
      require(["dojo/parser", "dijit/MenuBar", "dijit/MenuBarItem", "dijit/PopupMenuBarItem", "dijit/DropDownMenu", "dijit/MenuItem"]);  
 </script>  

Link /app/resources/spring/ based on setting in current project only.

Dev info:
Codename APR

Tuesday 25 December 2012

Request method 'POST' not supported bila guna RequestMethod.DELETE dan RequestMethod.PUT

Hahaha, kelakar lak bila kenangkan error ni, ingatkan Spring 3.0.5 tak support ka, atau tak guna teknologi REST ... tapi rupa-rupanya ada config yang perlu ditambah dalam web.xml.

Lain kali sila jangan buat lagi.

Thanks to +Osman McGee for this solution. :)

 Archiq: kena ada ni kot..  
 <filter>  
      <filter-name>HttpMethodFilter</filter-name>  
      <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>  
 </filter>  
 pastu mapping dia..  
 <filter-mapping>  
      <filter-name>HttpMethodFilter</filter-name>  
      <url-pattern>/*</url-pattern>  
 </filter-mapping>  

Dev info:
Codename APR.

Friday 21 December 2012

Ibatis 2: SQL Map untuk Oracle DB Procedure.

 <procedure id="StaffAppraisal.updateKra" parameterClass="map">  
      <![CDATA[  
       {  
           #p_return_val,jdbcType=DECIMAL,mode=OUT# = call appraisal.update_kra(   
                #p_staff_id,jdbcType=VARCHAR,mode=IN#,   
                #p_appraisal_seq,jdbcType=VARCHAR,mode=IN#,  
                #p_session_code,jdbcType=VARCHAR,mode=IN#,   
                #p_year,jdbcType=VARCHAR,mode=IN#,  
                #p_kra,jdbcType=VARCHAR,mode=IN#,   
                #p_errmsg,jdbcType=VARCHAR,mode=OUT#  
           )  
       }  
      ]]>  
 </procedure>  

Dev info : 
Codename= APAR
DB = Oracle 10G

Contoh DAO (tiada kena mengena dengan map di atas):
...
      public String sendEmail (String formOwnerId, String emailType, String refCode)  
      {  
           String errorMesej = null;  
           Map<String,String> param = new HashMap<String,String>();  
           param.put("p_staff_id"     , formOwnerId);  
           param.put("p_email_type", emailType);  
           param.put("p_ref"          , refCode);  
           param.put("p_errmsg"     , refCode);  
           this.getSqlMapClientTemplate().update("EMAIL.sendEmail", param);  
           errorMesej = param.get("p_errmsg");  
           return errorMesej;  
      }  

...


How to call an Oracle 10G procedure in ibatis 2?

Wednesday 19 December 2012

dijit.form.Button : calling javascript function

Ini adalah cara sesuai untuk masukkan function js dalam button dojo.
Jika function onClick digunakan melalui cara biasa, ada masalah ketika rendering.
Masalahnya? cari sendiri... hehehe.
 <button data-dojo-type="dijit.form.Button" type="button"      id="btnCancel"  
      data-dojo-props="onClick:function(){window.location='<c:out value="${cancel_url}" />';}" >Cancel</button>  

Tuesday 18 December 2012

dijit.form.DateTextBox example

 <form:input path="asEndDate" id="endDate" type="text" data-dojo-type="dijit.form.DateTextBox"  
      data-dojo-props="onChange: function() {dijit.byId('fromDate').constraints.max = arguments[0];  
      dijit.byId('asReviewStart').constraints.max = arguments[0];  
      dijit.byId('asReviewEnd').constraints.max = arguments[0];            
      }, required: true, constraints:{datePattern: '${datePattern}'}" />  

dojox.widget.DialogSimple: not validate while submit

gunakan dojox.widget.DialogSimple untuk 1 form. Dalam form ini ada dijit.form.DateTextBox dengan option required=true.

Apabila form ini dalam 1 page biasa, DateTextBox  itu akan validated apabila submit.

Namun apabila form ini dimuatkan dalam DialogSimple, tiba2 sahaja validation tidak berfungsi (validation berlaku, namun form masih dihantar).

Penyelesaian:

Gunakan dojo form

<form:form name="aprSessionSetupForm" id="aprSessionSetupForm" modelAttribute="aprSession" action="${formMethod}" data-dojo-type="dijit/form/Form" >

kemudian tambah skrip


<script type="dojo/on" data-dojo-event="submit">
        if(this.validate()){
            return true;
        }else{      
            return false;
        }
        return true;
</script>

jasperreports-4.5.0 : java.lang.NoSuchFieldError: PRINTSCALING

java.lang.NoSuchFieldError: PRINTSCALING

Masalah muncul ketika sistem generate pdf.

Lib:
jasperreports-4.5.0.jar

Solution:
Update itext to latest version, current version is itext-2.1.7

Framework:
Spring 3.0.5

Friday 14 December 2012

dojox.widget.DialogSimple : Unable to load

Error:

 RequestError: Unable to load /slaps/app/setup/aprSession/edit/APRS1?dojo.preventCache=1355475120302 status: 404  
 .cache.dojo/errors/create/</</_56d()dojo.js (line 15)  
 _3dd()dojo.js (line 15)  
 _3e9()dojo.js (line 15)  
 ...);var _350=_33a(_34e,{el:1});var qt=_34e.tag;var _351=("*"==qt);var ecs=_300()["...  

Punca: 

Tidak boleh load sebab tiada request mapping sesuai dalam controller

javax.validation.ValidationException: Unable to find a default provider

Masalah:

javax.validation.ValidationException: Unable to find a default provider 

Penyelesaian: 

include Hibernate Validator versi 4.1

Rujukan: 

http://stackoverflow.com/questions/2231100/spring-mvc-3-validation-unable-to-find-a-default-provider
http://stackoverflow.com/questions/3982950/javax-validation-validationexception-unable-to-find-default-provider

Environment:

Ibatis 2, Spring 3.05

Projek terlibat:

apr

Wednesday 12 December 2012

Sitemesh: Pattern tidak dikenali Spring framework

Adoiyai, masalah besar gak ni. Sitemesh tak gunakan mapping untuk pattern yang disytiharkan.

 <decorator name="default" page="deco-default.jsp">  
      <pattern>*/main*</pattern>  
      <pattern>*/list*</pattern>  
      <pattern>*/marking/*</pattern>  
 </decorator>  

Kesemua pattern di atas tidak dikenali, sebaliknya sitemesh hanya kenal pattern "/app".

Baca punya baca, rupa-rupanya kerana hanya "/app" sahaja yang ditunjukkan kepada Sitemesh oleh Spring.

Rujuk blog ini untuk keterangan: http://fahadshaon.wordpress.com/2012/07/24/sitemesh-2-with-spring-mvc-3-multiple-layout-for-multiple-controller/.

Namun solution gunakan "*.html" agak drastik maka solution lain perlu dicari. Akhirnya tiba ke forum berikut: http://stackoverflow.com/questions/2859014/sitemesh-and-spring-mvc-decorator-pattern-problems.

Setelah buat class ConfigDecoratorMapperSpringMvcSupport yang extend ConfigDecoratorMapper
 /**  
  *   
  */  
 package apr.external;  
 import java.util.Properties;  
 import javax.servlet.ServletException;  
 import javax.servlet.http.HttpServletRequest;  
 import org.apache.log4j.Logger;  
 import com.opensymphony.module.sitemesh.Config;  
 import com.opensymphony.module.sitemesh.Decorator;  
 import com.opensymphony.module.sitemesh.DecoratorMapper;  
 import com.opensymphony.module.sitemesh.Page;  
 import com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper;  
 import com.opensymphony.module.sitemesh.mapper.ConfigLoader;  
 /**  
  * Created by IntelliJ IDEA.  
  * User: Inf-root  
  * Date: 30.06.11  
  * Time: 1:00  
  *  
  */  
 public class ConfigDecoratorMapperSpringMvcSupport extends ConfigDecoratorMapper {  
   private static final Logger LOG = Logger.getLogger(ConfigDecoratorMapperSpringMvcSupport.class);  
   private ConfigLoader configLoader = null;  
    /** Create new ConfigLoader using '/WEB-INF/decorators.xml' file. */  
   public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException {  
     LOG.debug("init()...");  
     super.init(config, properties, parent);  
     try {  
       String fileName = properties.getProperty("config", "/WEB-INF/decorators.xml");  
       configLoader = new ConfigLoader(fileName, config);  
     }  
     catch (Exception e) {  
       throw new InstantiationException(e.toString());  
     }  
   }  
   /** Retrieve {@link com.opensymphony.module.sitemesh.Decorator} based on 'pattern' tag. */  
   public Decorator getDecorator(HttpServletRequest request, Page page) {  
     LOG.debug("getDecorator()...");  
     String thisPath = request.getServletPath();  
     LOG.debug("\tThisPath: " + thisPath);  
     String requestURI = request.getRequestURI();  
     LOG.debug("\t\tGet request URI: " + requestURI);  
     //TODO check indexes  
     thisPath = "/springURITemplate" + requestURI.substring(request.getContextPath().length(), requestURI.length() - 1);  
     LOG.debug("\t\t\tThisPath: " + thisPath);  
     String name = null;  
     try {  
       name = configLoader.getMappedName(thisPath);  
     }  
     catch (ServletException e) {  
       e.printStackTrace();  
     }  
     LOG.debug("\tResolved decorator name: " + name);  
     Decorator result = getNamedDecorator(request, name);  
     LOG.debug("Decorator is null ? " + (result == null));  
     return result == null ? super.getDecorator(request, page) : result;  
   }  
 }  

modify sitmesh.xml untuk override Decorator Mapper yang digunakan.

 <mapper class="apr.external.ConfigDecoratorMapperSpringMvcSupport">  
      <param name="config" value="${decorators-file}" />  
 </mapper>  

hasilnya pattern yang disebut tadi telah berjaya dikenali. :)