Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 当我尝试在数据表中添加新行时,bean属性不会被注入_Spring_Jsf_Primefaces_Autowired - Fatal编程技术网

Spring 当我尝试在数据表中添加新行时,bean属性不会被注入

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

登录应用程序后,我有一个数据表。为了简化这个问题,我只考虑一个专栏。该页面包含一个数据表和一个按钮add person。按下此按钮后,将打开一个弹出对话框,我必须在其中插入要添加的人的姓名。 JSF页面:

<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);
}