struts2 json field bridge

如果建立了一個model,但是經由action export,得到的是exception,或者不是你想要的結果。這時可以使用@JSONFieldBridge,也可以自行撰寫你想要回傳的值。

import org.apache.struts2.json.annotations.JSONFieldBridge;
import org.apache.struts2.json.bridge.StringBridge;
import org.bson.types.ObjectId;

public class Car{

     private ObjectId id;
     private String name;

     public void setId( ObjectId id ){
          this.id = id;
     }

     @JSONFieldBridge( impl  = StringBridge.class )
     public ObjectId getId(){ return id; }

     public void setName( String name ){
          this.name = name;
     }

     public String getName(){ return name; }
}

其中StringBridge會直接呼叫toString這個method。若你想修改回傳結果,可以實做FieldBridge這個class。以下是一個簡單的example

import org.apache.struts2.json.bridge.FieldBridge;
import org.bson.types.ObjectId;

public class ObjectIdFieldBridge implements FieldBridge{

    @Override
    public String objectToString( Object obj ){

        if( obj instanceof ObjectId )
            return "sparrow_"+obj.toString();

            return null;

    }   

}

JSONFieldBridge只有比較新版的struts才有,再來如果要回傳一個不是String type的值,似乎還沒有提供,只能解決一些比較簡單的需求,要不然只能自己組list

如果export一個model,但又不想把某個欄位值,也一起export出去的話,可以使用@JSON(serialize = false)

@JSON(serialize = false)
public String getName(){ return name; }

requirejs shim

使用同步載入,以往都是使用order plugin,在requirejs 2.0.1版,已經使用shim作為替代,可以直接定義各套件的相依性。

require.config({
    shim:{
        "sparrowApi":["module1","module2"]
    }
});

定義完後,直接require "sparrowApi" 就會自動載入module1module2了。

require.config({
    shim:{
        sparrowApi:{
            deps:["module1","module2"],
            exports:"sparrowApi"
        }
    }
});

如果使用exports這個attribute,可直接將"sparrowApi"回傳回來的值,直接定義成global變數,當然exports也可以使用function作為傳入值,然後在判斷要回傳什麼,作為global變數。