تست کردن اسپرینگ وب اپلیکیشن با @WebAppConfiguration

یکی از دوستان زحمت کشیدن و ایمیل زدن که مثالی که تویه پست قبل زدی درست نیست

یعنی واسه تست کردن وب اپلیکیشن باید @WebAppConfiguration را
به ابتدای متدهای
JUnit اضافه کرد. یعنی اینجوری نیست
که نشه وب اپلیکیشن رو به خاطر
context ای که داره
نشه تویه دسک تاپ تستش کرد.

برای دریافت اطلاعات بیشتر به ContextManagement در لینک زیر بروید :

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/testing.html#testing-introduction

دانلود سورس کد

نحوه استفاده از چند تا فایل کانفیگ Spring در یک پروژه

فرض کن واسه مدیریت آبجکت های زمان اجرا دو تا فایل کانفیگ داریم .حالا چرا دو تا ؟

یکی از فایل های کانفیگ در دسکتاپ اپلیکیشن ها جواب میده و اون یکی هم شامل آبجکت های وب هستش که نمیشه تویه دسکتاپ ازش استفاده کرد. واسه همین مجبوریم جداشون کنیم تا اگه خواستیم یه قسمت از اپلیکیشن رو در محیط دسکتاپ تست کنیم به راحتی این کار رو انجام بدیم .

واسه همین باید تویه فایل کانفیگ وب بیاییم کانفیگ دسکتاپ را ایمپورت کنیم .

 

کانفیگ دسکتاپ (spring-context.xml)

کانفیگ وب (spring-mvc-servlet.xml)

نحوه استفاده از کانفیگ دسکتاپ در برنامه (MainSpringTest)

نحوه استفاده از کانفیگ وب در برنامه وب (web.xml)

 

منبع : How to load multiple Spring bean configuration file

دانلود سورس کد

download complete CRUD application using SpringMVC + Hibernate

Add, Edit, Delete, Search using Spring, Hibernate, MySQL

 

1. Setup a Dynamic Web project and convert it to maven project

2. Add the dependencies - be sure to clean install in maven to put your needed jars in the project so you won't have library issue while coding

3. Setup the database

4. Create model class - add JPA annotations

5. Create DAO components - @Repository

6. Create Service components - @Service

7. Create Controller component - @Controller

 - be sure to put BindingResult immediately after @ModelAttribute or else you will got issues

8. Create the View components - JSPs

9. Configurations

- jdbc.properties

- spring-servlet.xml

- log4j.xml

- hibernate.cfg.xml

- finally web.xml

10. Clean compile

 

Download Source Code

View output

منابع :

 چه جوری از URI در لایه کنترل استفاده کنیم

چه جوری واسه فرم ولیدیشن یه کلاس بنویسیم و چه جوری اون رو سرویس کنیم

چه جوری سطرهای گرید رو شناسایی کنیم

سوال :

چه جوری دوتا کانکشن درست کنیم

 

فراخوانی StroreProcedure در Hibernate

همه میدونیم که Hibernate و JPA اومدن تا ما  رو از شر نوشتن StroreProcedure راحت کنن .  اصلا Hibernate و StoreProcedure یه جوارییی با هم متضاد هستن . حالا اگه به دلیلی در یه پروژه ای احتیاج داشتیم تا یک StoreProcedure را اجرا کنیم ,  Hibernate این امکان را به ما می دهد تا با استفاده از متد createSQLQuery این کار را انجام دهیم . با کلیک بر روی لینک های زیر میتوانید نمونه کد نوشته شده در این زمینه را مشاهده کنید :

Person.java

PersonDAO.java

PersonDAOImpl.java

PersonBO.java

PersonBOImpl.java

psvm.java

spring.xml

دارم به یه مساله ای فکر میکنم: من یک StoreProcedure نوشتم که میاد عملیات FEFO را در انبار انجام میدهد.آی دی درخواستی که به انبار اومده بعنوان ورودی بهش پاس داده میشه و میره  اون کالایی که تاریخ انقضاش زودتره رو برمیداره و آماده خروج از انبار میکنه.

این StoreProcedure الان داره کار میکنه بنظر شما اگه بخوام این تراکنش ها رو با کمک هایبرنیت پیاده سازی کنم قضیه چه جوریه :

 

ALTER PROCEDURE [dbo].[SP14_FEFO]

 @OrderID VARCHAR(200)

AS

BEGIN

--################################################################     

DELETE FROM dbo.OrderBatchLack WHERE OrderID=@OrderID --delete kasri allocate systemi

--################################################################     

DECLARE crsA CURSOR LOCAL FAST_FORWARD FOR

SELECT    

        Goods.ID AS GoodsID

      , Goods.GoodCode

      , Goods.GoodName

      , OrderDetail.ODPUQU - dbo.FN22_FindDisplacedForOrder(@OrderID,Goods.ID) AS GoodsQty

FROM        

      Goods INNER JOIN

      OrderDetail ON Goods.ID = OrderDetail.GoodsID INNER JOIN

      OrderHeader ON OrderDetail.OrderID = OrderHeader.ID

WHERE    

            OrderHeader.Activation = 1

      AND OrderDetail.Activation = 1

      AND OrderHeader.ID = @OrderID

      AND OrderDetail.ODPUQU - dbo.FN22_FindDisplacedForOrder(@OrderID,Goods.ID) <> 0

--=====================================================================================

OPEN crsA;

declare @crsA_GoodsID  varchar(50)

declare @crsA_GoodCode varchar(50)

declare @crsA_GoodName varchar(50)

declare @crsA_GoodsQty varchar(50)

FETCH NEXT FROM crsA INTO @crsA_GoodsID, @crsA_GoodCode, @crsA_GoodName , @crsA_GoodsQty

--=====================================================================================

WHILE @@FETCH_STATUS = 0

BEGIN

      declare @x bigint

      set @x = CAST(@crsA_GoodsQty as varchar(50))

      PRINT('init @x= '+cast(@x as varchar(50)));

      --#######################################################################

      DECLARE crsB CURSOR LOCAL FAST_FORWARD FOR -- Nested cursor

            SELECT ID, OnHandy FROM Batch WHERE    

                  Activation = 1

                  AND OnHandy <> 0

                  AND GoodsID = @crsA_GoodsID

            ORDER BY BExpireDate , BBatchNo

 

      OPEN crsB

      declare @crsB_BatchID  varchar(50)

      declare @crsB_OnHandy  bigint

      FETCH NEXT FROM crsB INTO  @crsB_BatchID , @crsB_OnHandy

      WHILE @@FETCH_STATUS = 0     

      BEGIN

            --========================================================       

            IF(@x = 0) BEGIN BREAK; END

            PRINT('@crsB_BatchID = '+@crsB_BatchID);

            PRINT('@crsB_OnHandy = '+cast(@crsB_OnHandy as varchar(50)) );

            --========================================================       

            set @x = @x - @crsB_OnHandy

            --========================================================

            declare @khoruj bigint

           

            if(@x>=0)

                  begin

                        set @khoruj = @crsB_OnHandy

                  end;

            else if(@x <0)

                  begin

                        set @khoruj = @x + @crsB_OnHandy

                        set @x=0;                    

                  end;

            --========================================================                   

            --PRINT('@khoruj = '+CAST(@khoruj AS VARCHAR(50)));                    

            declare @khorujCU as varchar(50)

            select @khorujCU = dbo.FN12_GetQty('Case.Unit',@crsA_GoodsID,@khoruj)

            --PRINT('@khorujCU = '+@khorujCU);                   

            exec dbo.SP07_OrderBatch 'INSERT',@OrderID,'',@crsA_GoodsID,@crsB_BatchID ,@khorujCU

            --========================================================             

            FETCH NEXT FROM crsB INTO  @crsB_BatchID , @crsB_OnHandy

      END

      CLOSE crsB

      DEALLOCATE crsB

      --#######################################################################

      PRINT('final @x = '+cast(@x as varchar(50)));

      if(@x<>0)

            begin

                  insert into dbo.OrderBatchLack(OrderID,GoodsID,GoodsCode,GoodsName,ItemQty) values (@OrderID,@crsA_GoodsID,@crsA_GoodCode, @crsA_GoodName,@x)

            end

      --#######################################################################

      FETCH NEXT FROM crsA INTO @crsA_GoodsID, @crsA_GoodCode, @crsA_GoodName , @crsA_GoodsQty

END

CLOSE crsA;

DEALLOCATE crsA;

--=====================================================================================

END

مستقیم jdbc با رانندگی jtds

اگه خیلی عجله داری . یا به هر دلیلی نمیخوای با هایبرنیت و اسپرینگ درگیر بشی و فقط میخوای یه کوئری یا یه استور پروسیجر رو چک کنی میتونی با کد زیر مستقیماً وصل بشی به بانک و کوئری رو تستش کنی .

فقط یادت نره که درایور jTDS رو با استفاده از maven به پروژه اضافه کنی .

----------------------------------------------------------------

package org.saye.service;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import java.sql.*;
import java.util.LinkedList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: ameysami
 * Date: 3/5/13
 * Time: 1:10 PM
 * To change this template use File | Settings | File Templates.
 *


 * http://www.jdbc-tutorial.com/jdbc-tutorials/prepared-statements-tutorial
 */
@Service
public class DatabaseHandlerImpl implements DatabaseHandler {
    private Connection con = null;
    private CallableStatement cstmt = null;
//    private PreparedStatement pstmt = null;
    private Statement stmt = null;

    private ResultSet rs = null;
    private static Logger log = Logger.getLogger("DatabaseHandlerImpl");

    public DatabaseHandlerImpl() {
        String databaseUrl = "jdbc:jtds:sqlserver://Oracle01/Sale;";
        String databaseUsername = "sa";
        String databasePassword = "111111";
        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            con = DriverManager.getConnection(databaseUrl, databaseUsername, databasePassword);
            System.out.println("Connection successful");
        } catch (Exception e) {
            System.err.println("Cannot connect to database server");
            e.printStackTrace();
        }
    }

    public List gettblPersonnel(String personnelRef, String supervisorRef, String dCRef, String personnelTypeRef) {
        List ll = new LinkedList();
        try {
            cstmt = con.prepareCall("{ call gettblPersonnel(?,?,?,?) }");
            cstmt.setString(1, personnelRef);
            cstmt.setString(2, supervisorRef);
            cstmt.setString(3, dCRef);
            cstmt.setString(4, personnelTypeRef);

            log.info("exec gettblPersonnel " + personnelRef + "," + supervisorRef + "," + dCRef + "," + personnelTypeRef);
            rs = cstmt.executeQuery();

            while (rs.next()) {
                PersonnelDTO personnelDTO = new PersonnelDTO();
                personnelDTO.setID(rs.getString(1));
                personnelDTO.setPersonnelName(rs.getString(1) + " : " + rs.getString(2));
                personnelDTO.setPersonnelPhone(rs.getString(3));
                personnelDTO.setPersonnelImage(rs.getBytes(4));
                personnelDTO.setPersonnelCode(rs.getString(5));

                ll.add(personnelDTO);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ll;
    }

    public byte[] getPersonnelImage(String ID) {
        PersonnelDTO personnelDTO = new PersonnelDTO();
        try {
            String sqlString = "SELECT PersonnelImage from tblPersonnel WHERE ID=" + ID;
            stmt = con.createStatement();
            rs = stmt.executeQuery(sqlString);
            log.info(sqlString);

            while (rs.next()) {
                log.info("salam");
                personnelDTO.setPersonnelImage(rs.getBytes(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return personnelDTO.getPersonnelImage();
    }

    public static void main(String[] args) {
        DatabaseHandlerImpl handler = new DatabaseHandlerImpl();
        //handler.gettblPersonnel("0", "0", "1", "0");
        handler.getPersonnelImage("12");
    }
}

----------------------------------------------------------------

شرمنده اگه کد هام شلوغ پلوغه . ایکاش یه وب سایت داشتم.

اگه فایل log4j.properties به هر دلیلی در Tomcat دیپلوی نشد

اگه فایل log4j.properties به هر دلیلی در Tomcat دیپلوی نشد

تنظیمات زیر را به فایل pom.xml اضافه کن تا موقع deploy شدن پروژه این فایل هم به سرور منتقل بشه .

        #resources#

            #resource#

                #filtering#false#/filtering#

                #directory#src/main/resources#/directory#

                #includes#

                    #include#**#/include#

                #/includes#

            #/resource#

            #resource#

                #filtering#false#/filtering#

                #directory#src/main/java#/directory#

                #includes#

                    #include#**#/include#

                #/includes#

                #excludes#

                    #exclude#**/*.java#/exclude#

                #/excludes#

            #/resource#

        #/resources#

شرمنده ام اگه بجای <> از # استفاده کردم چون بلاگفا خرابش میکنه .

نکته : اگه jar فایل فعلی با jar تویه AS کانفلیکت داره scope اون رو در فایل pom.xml بزن provided

نکته : اگه یه جار فایل داری که maven نمیتونه تویه جاهای معمول پیداش کنه برو تو فایل pom.xml با استفاده از تگ repository آدرس remote اون رو وارد کن تا maven  بتونه بره از remote برش داره و تویه لوکال خودش کپی کنه.

حل خطا Not supported by BasicDataSource

اگه دارید با هایبرنیت و اسپرینگ کار می کنید و خطای زیر رو می بینید:

Not supported by BasicDataSource

باید دو تا خط زیر را از کانفیگ هایبرنیت حذف کرده و همینکه این اطلاعات رو داخل دیتا سورس داریم کفایت میکنه :

your-password

hibernate.connection.password

your-username

hibernate.connection.username

منتها بعضی وقتا که داریم با کنسول هایبرنیت idea کار میکنیم خود idea میاد و این دستکاری ها رو بطور اتوماتیک انجام میده .

حالا چرا این اتفاق می افته ؟ چون بعضی از ApplicationServer ها اجازه authenticate کردن یک کانکش رو به ما نمیدن.

منبع :

https://confluence.atlassian.com/display/CONF28/Fix+%27Not+supported+by+BasicDataSource%27+Setup+or+Startup+Error

 

 

راستی یادم رفت اینو بگم :

کنسول هایبرنیت idea یه ابزار جالبه که باهاش میشه کوئری های HQL رو اجرا کرد.

 

رفع خطا Hibernate and java.lang.NoSuchFieldError: TRACE

اگه دارید با هایبرنیت و اسپرینگ کار می کنید و خطای زیر باعث شده تا نتونید آبجکت SessionFactory را بصورت Autowire مقدار دهی کنید علتش اینه که باید dependency مهم sl4j-log4j را هم به پروژه اضافه کنید .

Hibernate and java.lang.NoSuchFieldError: TRACE

منبع :

http://coders-kitchen.com/2013/01/18/hibernate-and-java-lang-nosuchfielderror-trace/

 

Normal 0 false false false EN-US X-NONE AR-SA /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0in; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;}

حل مشکل حروف فارسی در SpringMVC

برای حل مشکل حروف فارسی در SpringMVC

باید فیلتر encodingFilter  

از کلاس org.springframework.web.filter.CharacterEncodingFilter

برای تمام url های پروژه

را به پروژه اضافه کنیم تا مطمئن بشیم UTF-8 به همه صفحات jsp اعمال میشود.

init-param را هم مطابق جدول زیر مقدار دهی می کنیم.

param-name

param-value

Encoding

UTF-8

forceEncoding

True

 

 

منبع :

 

پی نوشت :

آقای یادت نره که در فایل pom.xml باید نوع پروژه را از jar به war تبدیل کنی.

از @Autowire نمی توان در wicket استفاده کرد ؟

فکر میکنم از @Autowire نمی توان در wicket استفاده کرد منتظرم تا ببینم برنامه نویس های اون ور چه جوابی واسه این سوال دارن .

نتیجه اش رو میتونین در لینک زیر ببینید :

http://apache-wicket.1842946.n4.nabble.com/Spring-Autowire-not-working-td4658728.html


سیم بندی اتوماتیک پروژه با اسپرینگ 3 (Auto Wire j2ee project using Spring3)

In this tutorial you will learn how to implement Hibernate persistence using the Spring framework in a transactional fashion.

After reading this tutorial you will be able to implement Hibernate persistence using Spring framework. Additionally you will also use Spring Hibernate transaction manager to manage all the transactional boilerplate code and wiring for you.

01.pom.xml.1.png

02.pom.xml.2.png

03.model.png

04.dao.png

05.daoImpl.png

06.service.png

07.serviceImpl.png

08.spring.xml.png

09.test.png

10.output.png

download source code

resource : bytesLounge.com

واقعا دارم از کار کردن با idea لذت میبرم

چند وقتی بود که با notepad++ کد میزدم . خیلی ازش راضی بودم چون سبک بود و سریع می اومد بالا. ولی از وقتی با idea کار کردم دارم از زندگی لذت میبرم فکر کنم سیستم داخلیش یه بانکه اطلاعاتیه چون از همه چی بک آپ داره . وقتی با visual studio مقایسه اش میکنم از اون هم کاملتره.

واقعاً حیفه که آدم این ادیتور رو بیخیال بشه و بره سراغ ادیتور های دیگه. ولی کاریش نمیشه کردم بعضی وقت ها مجبور میشه واسه هندهلد موبایل کد بزنی و هیچ راه دیگه ای نداری.

 میشه آخرین نسخه اش رو از سایت soft98.ir دانلود کرد.