如EjbTestBean類 遠程調用
1.jboss Jnd名子EjbTestBean/remote
2.webLogic名子EjbTestBean#接口全路徑(com.IejbTest)如EjbTestBean#com.IejbTest
可查看相關資料,這裡不多說
Ejb遠調調用類中一定要指定mappedName
@Stateless(mappedName="EjbTest")中的mappedName屬性
Type genType = clazz.getGenericSuperclass();
想得到一個父類中的泛化參數,在WebLogic是得不到的
要以select , update ,delete開頭
Count()裡要放入對象,不能是 * 號
Fetch遇到的問題 有fetch的語句不能用select count(s) from SpBean as s left join fetch s.lbBean來查詢,因為fetch會立即加載,但加載的時候沒有在返回的值中找到與之對應的外鍵ID,所以會出錯
WebLogic有時返回List 會出問題,不知是為什麼,可以自己寫一個List對象繼承ArrayList
這樣也就實現等於實現了List接口,也是一個List對象
/** 商品端
* CascadeType.REMOVE這裡不級連刪除,因為當商品表中有多於1條數據時,級連刪除會出錯
* @return
*/
@OneToMany(cascade={CascadeType.PERSIST},fetch=FetchType.LAZY,mappedBy="lbBean")
@OrderBy(value="spId desc")
public List<SpBean> getSpSet() {
return spSet;
}
/**
* 類別端
*/
@ManyToOne(cascade={CascadeType.REFRESH})
@JoinColumn(name="lb_id",insertable=false,updatable=false)
public LbBean getLbBean() {
return lbBean;
}
//商品Bean中要實例化類別Bean
//並且在添加和修改時要指定這個Bean 中的Id,不然會出錯的
private LbBean lbBean = new LbBean();要初如化
這樣就可以對商品表中的數據操作,但是在對類別表中的刪除時會有問題
JPA不支持對類別表中的刪除,同時刪除商品表中的多條數據
這個時候我們就要自己寫刪除語句,先刪除商品表,然後刪除類別表
1,返回List 對象List 中包含一個對象,這些是可以直截返回的
@WebMethod
@WebResult(name="List")
public List<TestBean> returnListAA(String st) {
List list = new ArrayList<UserBean>();
list.add(new TestBean(11,"dddd"));
list.add(new TestBean(333,"eeee"));
return list;
}
2.返回Bean 對象
@WebMethod
@WebResult(name="UserBean")
public UserBean getUserBean(String st){
UserBean bean = new UserBean("22","落地燈霜"+st);
return bean;
}
3.返回HashMap對象 要經過封裝
1> MapValues 類
public class MapValues {
public String key;
public Object value;
public MapValues(){}
public MapValues(String key,Object value){
this.key = key;
this.value = value;
}
}
2> MapValuesAdapter類 繼承XmlAdapter,實現裡面的方法
public class MapValuesAdapter extends XmlAdapter<MapValues[], HashMap<String, Object>>{
/**
* 將HashMap轉化為數組
*/
@Override
public MapValues[] marshal(HashMap<String, Object> arg0) throws Exception {
MapValues[] mv = new MapValues[arg0.size()];
int i = 0;
for(Entry<String, Object> en:arg0.entrySet()){
mv[i++] = new MapValues(en.getKey(),en.getValue());
}
return mv;
}
/**
* 將數組對象轉化為HashMap
*/
@Override
public HashMap<String, Object> unmarshal(MapValues[] arg0) throws Exception {
HashMap<String, Object> hm = new HashMap<String, Object>();
for(MapValues mv:arg0){
hm.put(mv.key, mv.value);
}
return hm;
}
}
3> UserHashMap類 在類中HashMap屬性中加入@XmlJavaTypeAdapter(MapValuesAdapter.class)
這些就可以傳遞HashMap對象
public class UserHashMap {
@XmlJavaTypeAdapter(MapValuesAdapter.class)
public HashMap<String, Object> hMap;
}
用法:
@WebMethod
@WebResult(name="UserHashMap")
public UserHashMap returnHashMap(String st) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("111", "aaaa");
map.put("22", new UserBean("333","rrr"));
map.put("33", new TestBean(44,"ttt"));
UserHashMap uhm = new UserHashMap();
uhm.hMap = map;
return uhm;
}
4,傳入List對象,HashMap對象,Bean 對象,返回List對象
@WebMethod
@WebResult(name="List")
public List<TestBean> search( List list,
UserHashMap seachMap,
TestBean bean){
return ejbLog.testLog("我是日志");
}
WebSerice類中的要加入的注解
@WebService(name = "IEjbTest", serviceName = "EjbTestService",targetNamespace="http://192.168.0.127")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public class EjbTest implements IEjbTest {
這個服務端就寫好了,WebLgic提供有測試的頁面可以在裡面測試一下
供JNDI查找調用
今天嘗試著測試一下Weblogic 11g的MDB功能,發現盡管引入了weblogic.jar,可是仍然有很多J2EE的Class找不到。我本地沒有安裝Weblogic,只好一個類庫,一個類庫的找。後來在網上發現,原來在Weblogic 10以後,應該使用wlfullclient.jar來取代weblogic.jar。可以使用下面的辦法生成wlfullclient.jar。
Creating a wlfullclient.jar File for a Client Application
Use the following steps to create a wlfullclient.jar file for a client application:
cd WL_HOME/server/lib
java -jar ../../../modules/com.bea.core.jarbuilder_1.0.0.0.jar
生成的wlfullclient.jar放到客戶端服務器Lib中,
如放入Jboss
D:\Jboss\jboss-4.2.2.GA\server\default\lib