JBoss tool/seam, JSF, Richfaces, A4J, Eclipse 备忘录

项目一开始就陷入细节,企图在一些细节方面做得完美。岂知这样浪费了很多时间,客户还不一定买账,得不偿失。
原来打算用Ajax将界面做的快一点,方便一点,用户完成一个功能不需要很多页面。这些锦上添花的东西完全可以放到以后做。

今天用A4J又出一点麻烦,commandlink 没有反应。检查浏览器 web page 源文件发现调用的JS语句中form位置的参数为null。原来用<form>不行,要用<h:form>


Hibernate的实体Bean的Annotation一定要放在get方法前面,Toplink Essentials放在Field前就可以。如果Hibernate在get方法前没有发现@OneToOne这些Annotation,就会将对象字段生成tinyblob类型的数据。
Hibernate 的 ManyToMany 很奇怪。记得在 toplink essentials 中只要声明一方就好了。 而在 Hibernate 里要声明两方。否则不能确定 Type. 一旦声明了两方他又试图创建两个连接表,创建的时候又出错。结果一个查询出错,不能找到表。最后用 Native SQL 解决。
Hibernate的实体Bean如果有一个getXXX,他将被看作一个属性,并且试图确定它的Type.如果不用持久化,标记@Transient.

虽然设置了 <property name="hibernate.hbm2ddl.auto" value="update"/>, 但是修改EntityBean's annotation后,hibernate不会更新数据表结构定义。例如:

@ManyToMany(targetEntity=Page.class, cascade=CascadeType.ALL)
@JoinTable(name="sku_page",joinColumns={@JoinColumn(name="skus_id",referencedColumnName="id" )},inverseJoinColumns={@JoinColumn(name="pages_id",referencedColumnName="id" )},uniqueConstraints={@UniqueConstraint(columnNames={"skus_id","pages_id"})})
public Set<Page> getPages() {
return pages;
}



@ManyToMany(targetEntity=Sku.class, cascade=CascadeType.ALL,mappedBy="pages")
public Set<Sku> getSkus() {
return skus;
}



到数据库里面一看,连接表的外键约束还是restrict. 删除表重新部署,hibernate生成了一个表,但是约束仍然不对。后来自己修改数据表的外键为cascade.


facelet 的 include 标签如果找不到src文件会导致渲染出错。最后创建了一个defaultMap.html,里面只有一行。

navigator.xhtml


<!--if ui:include's src is resolved to null or empty, EL will throw a overflow exception -->
<!--if ui:include's src is resolved to other string than a file path, it will take it as an jndi name-->
<ui:include src="#{navigator.mapFilePath}" />



NavigatorBean

public String getMapFilePath() {
String s = "";
try {
s = mapPath + getPageNumber() + mapExtName;
} catch (Exception e) {

s = mapPath + "defaultMap" + mapExtName;
}
return s;

// return mapFilePath;
}



JSF RI的panelgrid很方便,将很多元素排列整齐,但是不够灵活。最后首页上的排版还是用div完成。

今天jboss seam偶尔出现 failed to get lock on Synchronized component 错误。估计是a4j调用component时候线程冲突。试一试 @Synchronized(timeout=xxxxxxxxxx),然后调整一下web page上的 a4j 标签的时间类属性。加上@Synchronized(timeout=xxxxxxxxxx)后Eclipse的代码编辑器出现NullPointerException,不能打开文件,因为不能解析那个@Synchronized annotation。后来在外部编辑器中去掉它。

Query使用第二次出现hibernate抛出的 exception:session is closed。将PersistenceContext的type设成EXTENDED,解决。
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;


用Integer,Long,Float不如用int,long,float,不用初始化有初值,不易出错。

Jboss seam 的components 生命周期。 今天在一个Conversation component 里面引用了一个javabean,缺省的是Event context,也就是调用一次就消失了。我用@In注入,结果在conversation 结束之前他就消失了。并不会因为你有引用jboss seam 就替你留着。后来还是new了一个解决问题。
@In
FacesMessages facesMessages;
将注入全局消息组件。变量必须是facesMessages。否则出错。看来是变量名和seam组件的@Name("XXX")绑定。


如果Conversation组件没有开始conversation,例如用@Begin,那么它的表现就像event 组件一样。

I added an attribute class="xxx" to rich:panel tag. Facescontext threw an exception: setter not found on property class. wasted almost one hour to debug this. becasue "class" is not an attribute for that tag. I'd better set those attribute in properties panel than code it in code editor.

关于属性。有一个属性US_desc,虽然惯例应该小写开头,我想这个大写是有意义的,只要getter setter没错就好了吧。结果EL抛出错误,找不到属性。改为us_desc, OK.

今天 Hibernate 抛出异常 Caused by: java.lang.NullPointerException
at org.hibernate.type.IntegerType.next(IntegerType.java:59)
at org.hibernate.engine.Versioning.increment(Versioning.java:108)
at org.hibernate.event.def.DefaultFlushEntityEventListener.getNextVersion(DefaultFlushEntityEventListener.java:365) at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:128)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:515)


看来是flush的时候出了问题,但是为什么即使只有一个读操作也是这样?后来发现我的Entity里面有一个没有veriosn,其他的由Jboss Seam工具生成,但是setVersion是私有的。一一改过来,问题依旧。后来发现我在数据库里用外部工具插入很多行,这些行的version为null,将他们设为1,问题解决。

如果将id的css都放在全局css文件里会导致这个文件较大。而这些设置通常只是对一个页面。最好将id的css放在页面上,class的css放在全局css文件中。


Web App 2.5和以前的版本有些不同。Tag Lib 不需要配置。将tag lib jar拷贝到web-inf 的lib下就可以用了。

垂直居中:*{vertical-align: middle;}
应用于rich:panel的margin总是不起作用。原来CSS中没有写单位px。真粗心。

Jboss Seam 调试页面 。。。debug.seam

又出错了,
aused by: java.lang.InstantiationException: org.hibernate.ejb.QueryImpl
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at org.jboss.serial.classmetamodel.ClassMetaData.newInstance(ClassMetaData.java:334)
... 133 more
不知道是不是内存设置不够。


在实体bean中注入组件。
I can inject a seam component in Entity with:
Code:
EncryptionController anEncryptionController = (EncryptionController) Component.getInstance("encryptionController", true);


But is it possible to inject it with In annotation or some other annotation ?

No, bijection (and almost all other Seam annotations) doesn't happen in entities. It makes it harder to use a bad architecture/design ;)

今天Hibernate出了一点问题。在Eclipse重新启动Jboss问题依旧。不能找到JNDI绑定catalogEntityManagerFactory。下面是persistence.xml


<persistence-unit name="catalog">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/catalogDatasource</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:/catalogEntityManagerFactory"/>
</properties>
</persistence-unit>

后来重启了Eclipse,故障消失。


测试服务器上的MySQL是4.1.2的。很奇怪用终端运行mysql命令查询正常,但用Connector5.1,3.1都查询不到记录集,也没有错误提示。

用ssh输入密码服务器很麻烦,做了一个批处理文件,内容:putty -load testserver -l root -pw w3bs3rv3r -C
其中 testserver 是保存好的profile.


在windows下开发的web app放到Linux下根本不能运行。原来的表名是小写,到了Linux下Hibernate自动生成大写首字母的表。查询也不能用了。不知道问题在哪里。看来还是要在Linux下开发才行。如果在Linux下可以运行,放到Windows下会怎样呢?看来跨平台真不容易呀。


RedHat EL4自带MySQL4.12,太低。卸载还出错。后来解压了一个MySQL5.0 for generic linux 到/usr/local/mysql,OK. 数据库位置不变。在/etc/my.cfg中设定。也试过RPM版,安装不成功,缺少文件。

考虑安装Ubuntu8.04.从硬盘安装,需要启动管理器Grub,启动文件vmlinuz,initrd.gz,下载了一个Ubuntu-alternate-amd64.iso.解压它得到那两个启动文件。

RichFaces SKINs:

<context-param>
<param-name>org.richfaces.SKIN</param-name>
<!-- blueSky, classic,deepMarine,DEFAULT,emeraldTown,japanCherry,NULL,plain,ruby,wine -->
<param-value>NULL</param-value>
</context-param>



客户的 WebService 响应写得很简单,我想用JAXB来解决。每个请求、响应对应一个class,用XSteam转换。他的响应XML如下:

<DealerWholesalePriceRequest>
<company>0100</company>
<dealer>1006523</dealer>
<item>20000</item>
<quantity>1</quantity>
</DealerWholesalePriceRequest>


错误响应:

<OrderCancelResponse>
<orderHeader>
<CoastOrderNumber>12345678</CoastOrderNumber>
<Error>
<ErrorCode>000</ErrorCode>
<ErrorMsg>Request Accepted</ErrorMsg>
</Error>
<Error>
<ErrorCode>998</ErrorCode>
<ErrorMsg>Order has already been shipped. It is too late to cancel it.</ErrorMsg>
</Error>
<Error>
<ErrorCode>999</ErrorCode>
<ErrorMsg>Order not found</ErrorMsg>
</Error>
</orderHeader>
</OrderCancelResponse>


但是他的错误响应和成功响应要分析XML才能判断,不利于JAXB转换,类型不对会抛出错误。要和他商量看能不能扩展HTTP协议头来表示错误响应,简单的办法是增加状态码,反正还有很多保留的。2开头或者5开头都可以。5开头可能不合理,因为不是一个技术错误,而是业务错误。299或者200.123都可以。
HTTP协议状态码表示的意思
  1××  保留
  2××  表示请求成功地接收
  3××  为完成请求客户需进一步细化请求
  4××  客户错误
  5××  服务器错误


今天将客户发过来的classes打包成jar,参考进工程,很奇怪还是不能解析符号。class里面也看不到方法和字段。其他jar可以看到里面的方法字段等。--几天后重启Eclipse问题消失。


朋友要建一个网站,不过好像没有支持JBOSS AS, Glassfish这些服务器的空间。最多也就asp.net。常见的是asp,php。 在DW8里面试一试PHP,结果链接MYSQL出错。到时候一定要做了再去看看其他的吧。听说有delphi for php, zde,phpde.如果能找到现成的CMS就好了。

JBoss AS 有时候启动时失败。Connector不能绑定端口。 后来发现是QQ占用了端口。奇怪。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值