Spring 当我尝试在数据表中添加新行时,bean属性不会被注入
登录应用程序后,我有一个数据表。为了简化这个问题,我只考虑一个专栏。该页面包含一个数据表和一个按钮add person。按下此按钮后,将打开一个弹出对话框,我必须在其中插入要添加的人的姓名。 JSF页面:Spring 当我尝试在数据表中添加新行时,bean属性不会被注入,spring,jsf,primefaces,autowired,Spring,Jsf,Primefaces,Autowired,登录应用程序后,我有一个数据表。为了简化这个问题,我只考虑一个专栏。该页面包含一个数据表和一个按钮add person。按下此按钮后,将打开一个弹出对话框,我必须在其中插入要添加的人的姓名。 JSF页面: <h:body> <p:dataTable var="pers" value="#{personView.persons}"> <p:column headerText="Name"> <h:output
<h:body>
<p:dataTable var="pers" value="#{personView.persons}">
<p:column headerText="Name">
<h:outputText value="#{pers.name}" />
</p:column>
</p:dataTable>
<h:form id="newPersonForm" prependId="false">
<p:commandButton value="Add new person" type="button" onclick="PF('createPerson').show();" />
<p:dialog header="Add person" widgetVar="createPerson" modal="true" height="150">
<table>
<tr>
<td><h:outputLabel for="newPersonName" value="Name: * " /> </td>
<td><h:inputText id="newPersonName" required="true" label="newPersonName" value="#{person.name}"/></td>
</tr>
<tr>
<td><h:commandButton type="submit" id="addPerson" value="Add Person" action="#{person.newPerson()}" /></td>
</tr>
</table>
</p:dialog>
</h:form>
</h:body>
}
服务类别:
@Service
@Scope("prototype")
public class PersonService {
@Autowired
private PersonDao personDao;
public List<Person> getPersons(User user) {
return personDao.getPersons(user); // "select * from person where createdBy = ?"
}
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
public void addPerson(User user, String name) {
personDao.addPerson(user, name);
}
}
与用户一起登录后,人员列表将正确显示。在调试模式下,在PersonView.java的方法init中,正确加载了注入的属性personService。还将显示“添加人员”按钮。按下后,弹出对话框出现。输入新人姓名并按submit后,将抛出NullPointerException。我将断点放在那里,在类Person.Java中,personService属性为null。因此,linepersonService.addPersonloggedUser,name;java抛出这个异常
我的问题是如何正确注入此服务?或者,至少建议用另一个primeFaces标记替换?换句话说,在人员列表下,我想放置一个按钮AddPerson,它会打开一个弹出页面。此弹出页面包含带有人名的表单。按下submit后,我想看到这个人被添加到数据库和数据表中
我试图套用我的公认答案。问题是在PersonView中,正确注入了属性personService,并且加载了列表。当我想添加一个新的Person时,在p:dialog中我使用bean Person,在本例中,personService不被注入
我一直试图把PersonView的内容当面呈现出来。并且还编辑了JSF页面以仅使用bean Person。在本例中,personService.AddPerson不会抛出NullPointer,但在p:dialog中按submit后,人名为null,并且在personDao类中抛出NullPointerException
注:我是Spring和JSF的初学者,这个应用程序只是一个练习。因此,如果您有一些改进代码的建议,我持开放态度。我编辑了这个问题。问题是personService被注入PersonView.java中,而不是注入Person.java.in Person.java中。您在PersonView.java中没有@ManagedProperty{personService},而在PersonView.java中则没有。我添加了它,但我忘了在问题正文中编辑它,但问题仍然存在。不知何故,您每个bean都管理了两次。@Component和@Autowired被Spring理解,@ManagedBean和@ManagedProperty{personService}被旧的JSF弃用和理解。我不知道JSF是否能够解析{personService},否则它将为空。我也不知道{person}表达式的求值返回了哪一个Spring或JSF管理的实例。这两个bean管理系统的混合或混乱可能会导致任意问题。@Selaron问题是OP不知何故认为personService.GetPersonLoggeDuser返回Spring管理的bean。。OP只是将业务服务逻辑混合到模型中。OP应该将业务服务逻辑放在服务类而不是模型类中。
@ManagedBean
@Component
@Scope("prototype")
@Lazy
public class Person implements Serializable{
private int id;
private String name;
@Autowired
@ManagedProperty("#{personService}")
private PersonService personService;
//getters and setters
public String newPerson() {
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
User loggedUser = (User) context.getSessionMap().get("loggedUser");
personService.addPerson(loggedUser, name);
return "success";
}
@Service
@Scope("prototype")
public class PersonService {
@Autowired
private PersonDao personDao;
public List<Person> getPersons(User user) {
return personDao.getPersons(user); // "select * from person where createdBy = ?"
}
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
public void addPerson(User user, String name) {
personDao.addPerson(user, name);
}