您的位置:首页 > 编程语言 > Java开发

jsf+spring+jpa 程序中遇到的N多异常及解决办法

2013-03-22 15:59 453 查看
话不多说,直接上问题或异常及其解决办法。

1、现象:程序无异常,但jsf 标签在jsp页无法使用,各种<h:commandButton />和<h:outputText/>都无法正常显示,可能是我之前没那么粗心,以至于现在少了个空格,真是要命

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
这里 @和taglib直接是需要空格!

2

javax.persistence.PersistenceException: No Persistence provider for EntityManager named


这个异常就是说找不到persistenc.xml网上查了好多高级的解决办法,但我还是没有解决,都是说src下建一个META-INF,放入persistence.xml文件,但是我真是粗心到家了,像这种的文件前面明显的空格,我竟然没看清,也是因为第一次搞这个jsf,其实这个文件是死的

看到了吧,这文件有固定图标。

3、完事具备,页面也正常显示了,觉得可以使用spring注入,jpa管理数据库了,其实在faces-config.xml里需要一个spring和jsf的配置,

<application>
<locale-config>
<default-locale>zh_CN</default-locale>
</locale-config>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>


这里防止bean对象绕过spring的配置(说的不太清楚,反正这个配置文件是死的。)

4、spring注解:注解需要有两个,在service类里,

@Transactional// 注解1

public class UserService implements IUserService {这里对类进行注解,但是还没完,需要对EntityManager再做一个set方法的注解,否则在进行增删改查时会发现em是null,那时候你想破脑袋都不知道是怎么回事,自然是没get到值了:

@PersistenceContext
// 注解2
public void setEm(EntityManager em) {
this.em = em;
}


这个是针对unit只有一个,默认写,这里还一种写法,是指明name的,网上资料一大片,不再赘述。

5、然后就是在bean里对实体类,例如user和service类如userService,进行注入,有时候觉得自己牛逼,往往忽略了get方法,这里一定要写上,并且在展示页面上,一定是

用户id:<h:outputText value="#{userBean.user.id}"/>
用户名:<h:inputText value="#{userBean.user.name}"/>


这样子的,不可user.name因为还少一层。可能大部分人会犯一些高级错误,而我就犯这样的低级问题,而这样的问题也最气人,解决完也无任何成就感。

6、jsf遍历:这个时候终于能够遍历传过来的list了,

<h:dataTable  value="#{userBean.userList}" var="ub" styleClass="styleClazz"
headerClass="headerClazz" footerClass="footerClazz"
rowClasses="row1,row2" columnClasses="column1">
<h:column>
<f:facet name="header">
<h:outputText value="id" />
</f:facet>
<h:outputText id="id1" value="#{ub.id}" />
<f:facet name="footer">
<h:outputText value="****"/>
</f:facet>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{ub.name}" />
<f:facet name="footer">
<h:outputText value="****"/>
</f:facet>
</h:column>


但是如果你用user.id会出现空值,而列数确实一列也不少,这是为啥,因为user这个名让你用烂了,增加的时候

<title>增加用户</title>
</head>
<body>

<h:form >
<h3>用户信息</h3>
<h:panelGrid columns="2" cellpadding="5" styleClass="styleClazz"
headerClass="headerClazz" footerClass="footerClazz"
rowClasses="row1,row2" columnClasses="column1">
用户名:<h:inputText value="#{user.name}"/>
地址:<h:inputText value="#{user.addr}" />


这里用的user.name而你在显示时还是user.name就不好了,和session有关,我是这么认为的,如有不对,欢迎留言改正。

ps:最近各种Exception是搞得我头都大了,好在有同事可以问,所有有时实在解决不了也没什么,我们完全可以往上抛异常,有时候人的能力不在于你能解决什么,而是知道直接不能解决什么,大胆承认,认清自己的优缺点,才是人才。

欢迎关注微博:weibo.com/javawang
三爷不是我1 微博名@三爷不是我1,有任何问题可给我留言














































                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐