Java org.springframework.beans.factory.BeanCreationException:创建名为';appConfig';:自动关联依赖项的注入失败
我已经在我目前正在进行的项目上添加了一些更改。我有一个用户类和3个不同的配置文件(管理员、医生、患者) 我通过添加两个用户子类(Docteur和Patient)改变了项目的结构,配置文件是User或admin 用户:Java org.springframework.beans.factory.BeanCreationException:创建名为';appConfig';:自动关联依赖项的注入失败,java,spring,hibernate,spring-mvc,spring-data-jpa,Java,Spring,Hibernate,Spring Mvc,Spring Data Jpa,我已经在我目前正在进行的项目上添加了一些更改。我有一个用户类和3个不同的配置文件(管理员、医生、患者) 我通过添加两个用户子类(Docteur和Patient)改变了项目的结构,配置文件是User或admin 用户: package com.vivalio.springmvc.model; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.
package com.vivalio.springmvc.model;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name = "USER")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@NotEmpty
@Column(name = "SSO_ID", unique = true, nullable = false)
private String ssoId;
@NotEmpty
@Column(name = "PASSWORD", nullable = false)
private String password;
@NotEmpty
@Column(name = "FIRST_NAME", nullable = false)
private String firstName;
@NotEmpty
@Column(name = "LAST_NAME", nullable = false)
private String lastName;
@NotEmpty
@Column(name = "EMAIL", nullable = false)
private String email;
@Column(name = "DTCREATION", nullable = true)
private String dateCreation;
@Column(name = "JJCREATION", nullable = true)
private String jjCreation;
public String getJjCreation() {
return jjCreation;
}
public void setJjCreation(String jjCreation) {
this.jjCreation = jjCreation;
}
@Column(name = "MMCREATION", nullable = true)
private String mmCreation;
public String getMmCreation() {
return mmCreation;
}
public void setMmCreation(String mmCreation) {
this.mmCreation = mmCreation;
}
@Column(name = "YYCREATION", nullable = true)
private String aaCreation;
public String getAaCreation() {
return aaCreation;
}
public void setAaCreation(String aaCreation) {
this.aaCreation = aaCreation;
}
public String getDateCreation() {
return dateCreation;
}
public void setDateCreation(String dateCreation) {
this.dateCreation = dateCreation;
}
@NotEmpty
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_USER_PROFILE", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = {
@JoinColumn(name = "USER_PROFILE_ID") })
private Set<UserProfile> userProfiles = new HashSet<UserProfile>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSsoId() {
return ssoId;
}
public void setSsoId(String ssoId) {
this.ssoId = ssoId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Set<UserProfile> getUserProfiles() {
return userProfiles;
}
public void setUserProfiles(Set<UserProfile> userProfiles) {
this.userProfiles = userProfiles;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((ssoId == null) ? 0 : ssoId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof User))
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (ssoId == null) {
if (other.ssoId != null)
return false;
} else if (!ssoId.equals(other.ssoId))
return false;
return true;
}
@Override
public String toString() {
return "User [id=" + id + ", ssoId=" + ssoId + ", password=" + password + ", firstName=" + firstName
+ ", lastName=" + lastName + ", email=" + email + "]";
}
}
package com.vivalio.springmvc.model;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "DOCTEUR")
public class Docteur extends User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@OneToMany(mappedBy = "doc")
private Set<Patient> patients = new HashSet<Patient>(0);
public Set<Patient> getPatients() {
return patients;
}
public void setPatients(Set<Patient> patients) {
this.patients = patients;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
package com.vivalio.springmvc.converter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import com.vivalio.springmvc.model.UserProfile;
import com.vivalio.springmvc.service.UserProfileService;
/**
* A converter class used in views to map id's to actual userProfile objects.
*/
@Component
public class RoleToUserProfileConverter implements Converter<Object, UserProfile>{
static final Logger logger = LoggerFactory.getLogger(RoleToUserProfileConverter.class);
@Autowired
UserProfileService userProfileService;
/**
* Gets UserProfile by Id
* @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object)
*/
public UserProfile convert(Object element) {
Integer id = Integer.parseInt((String)element);
UserProfile profile= userProfileService.findById(id);
logger.info("Profile : {}",profile);
return profile;
}
}
package com.vivalio.springmvc.controller;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.security.authentication.AuthenticationTrustResolver;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import com.vivalio.springmvc.model.Consultation;
import com.vivalio.springmvc.model.User;
import com.vivalio.springmvc.model.UserProfile;
import com.vivalio.springmvc.model.UserProfileType;
import com.vivalio.springmvc.service.AppetitService;
import com.vivalio.springmvc.service.BouleService;
import com.vivalio.springmvc.service.ConsultationService;
import com.vivalio.springmvc.service.DocteurService;
import com.vivalio.springmvc.service.DouleurService;
import com.vivalio.springmvc.service.FaiblesseService;
import com.vivalio.springmvc.service.PatientService;
import com.vivalio.springmvc.service.UserProfileService;
import com.vivalio.springmvc.service.UserService;
import com.vivalio.springmvc.utils.Mail;
@Controller
@RequestMapping("/")
@SessionAttributes("roles")
public class AppController {
@Autowired
UserService userService;
@Autowired
UserProfileService userProfileService;
@Autowired
AppetitService appetitService;
@Autowired
FaiblesseService faiblesseService;
@Autowired
DouleurService douleurService;
@Autowired
BouleService bouleService;
@Autowired
MessageSource messageSource;
@Autowired
PersistentTokenBasedRememberMeServices persistentTokenBasedRememberMeServices;
@Autowired
AuthenticationTrustResolver authenticationTrustResolver;
@Autowired
ConsultationService consultationService;
@Autowired
PatientService patientService;
@Autowired
DocteurService docteurServices;
/**
* This method will list all existing users.
*/
@RequestMapping(value = { "/", "/list" }, method = RequestMethod.GET)
public String listUsers(ModelMap model) {
List<User> users = userService.findAllUsers();
model.addAttribute("users", users);
model.addAttribute("loggedinuser", getPrincipal());
return "userslist";
}
/**
* This method will provide the medium to add a new user.
*/
@RequestMapping(value = { "/newuser" }, method = RequestMethod.GET)
public String newUser(ModelMap model) {
User user = new User();
model.addAttribute("user", user);
model.addAttribute("edit", false);
model.addAttribute("loggedinuser", getPrincipal());
return "registration";
}
@RequestMapping(value = { "/newconsultation" }, method = RequestMethod.GET)
public String newConsultation(ModelMap model) {
Consultation consultation = new Consultation();
model.addAttribute("consultation", consultation);
model.addAttribute("edit", false);
model.addAttribute("loggedinuser", getPrincipal());
return "registrationConsultation";
}
@RequestMapping(value = { "/newuser" }, method = RequestMethod.POST)
public String saveUser(@Valid User user, BindingResult result, ModelMap model) {
if (result.hasErrors()) {
return "registration";
}
if (!userService.isUserSSOUnique(user.getId(), user.getSsoId())) {
FieldError ssoError = new FieldError("user", "ssoId", messageSource.getMessage("non.unique.ssoId",
new String[] { user.getSsoId() }, Locale.getDefault()));
result.addError(ssoError);
return "registration";
}
userService.saveUser(user);
Mail.sendMailRegistration("support@xxxxxxx.net", user.getEmail(), "xxxxxx@gmail.com",
"xxxxxx@gmail.com", "Creation de compte vivalio", "message");
model.addAttribute("success",
"User " + user.getFirstName() + " " + user.getLastName() + " registered successfully");
model.addAttribute("loggedinuser", getPrincipal());
// return "success";
return "redirect:/list";
}
/* ajouter la consultation du patient */
@RequestMapping(value = "/newconsultation", method = RequestMethod.POST)
public String saveConsultation(@Valid Consultation consultation, BindingResult result, ModelMap model) {
if (result.hasErrors()) {
return "registrationConsultation";
}
// Patient patient = (Patient) getUser();
consultation.setPatient(null);
consultationService.saveConsultation(consultation);
if (consultation != null && consultation.getPatient() != null) {
Mail.sendMailAfterConsultation("support@xxxxxxx.net", consultation.getPatient().getEmail(),
"xxxxxx@gmail.com", "xxxxxxx@gmail.com", "Envoi de la consultation a votre medecin : ",
"Votre consultation REF-" + consultation.getId()
+ " a ete envoyee a votre medecin avec succes. Vous serez contacte en cas d'urgence.<br/>Ci dessous un recap de votre consultation :<br/>"
+ "<br/>Poid : " + consultation.getParam1() + "<br/>" + "Appetit :"
+ consultation.getParam2() + "<br/>" + "Faiblesse :" + consultation.getParam3() + "<br/>"
+ "Douleur :" + consultation.getParam4() + "<br/>" + "Boule :" + consultation.getParam5()
+ "<br/>" + "Fievre :" + consultation.getParam6() + "<br/>" + "Commentaire :"
+ consultation.getCommentaire() + "<br/>" + "<br/>L'equipe vivalio Group"
);
}
model.addAttribute("param1", consultation.getParam1());
model.addAttribute("param2", consultation.getParam2());
model.addAttribute("param3", consultation.getParam3());
model.addAttribute("param4", consultation.getParam4());
model.addAttribute("param5", consultation.getParam5());
model.addAttribute("param6", consultation.getParam6());
model.addAttribute("commentaire", consultation.getCommentaire());
return "redirect:/list";
}
/**
* This method will provide the medium to update an existing user.
*/
@RequestMapping(value = { "/edit-user-{ssoId}" }, method = RequestMethod.GET)
public String editUser(@PathVariable String ssoId, ModelMap model) {
User user = userService.findBySSO(ssoId);
model.addAttribute("user", user);
model.addAttribute("edit", true);
model.addAttribute("loggedinuser", getPrincipal());
return "registration";
}
@RequestMapping(value = { "/edit-user-{ssoId}" }, method = RequestMethod.POST)
public String updateUser(@Valid User user, BindingResult result, ModelMap model, @PathVariable String ssoId) {
if (result.hasErrors()) {
return "registration";
}
userService.updateUser(user);
Mail.sendMailRegistration("support@xxxxx.net", user.getEmail(), "xxxxxxxx@gmail.com",
"xxxxxxxx@gmail.com", "Modification des informations vivalio",
"Votre utilisateur vivalio a été modifié");
model.addAttribute("success",
"User " + user.getFirstName() + " " + user.getLastName() + " updated successfully");
model.addAttribute("loggedinuser", getPrincipal());
return "redirect:/list";
}
/**
* This method will delete an user by it's SSOID value.
*/
@RequestMapping(value = { "/delete-user-{ssoId}" }, method = RequestMethod.GET)
public String deleteUser(@PathVariable String ssoId) {
userService.deleteUserBySSO(ssoId);
return "redirect:/list";
}
/**
* This method will provide UserProfile list to views
*/
@ModelAttribute("roles")
public List<UserProfile> initializeProfiles() {
return userProfileService.findAll();
}
/**
* This method will provide Docs list to views
*/
@ModelAttribute("docteurs")
public List<User> initializeAllDocs() {
return userService.findAllDocs();
}
/**
* This method will provide Appetit list to views
*/
@ModelAttribute("appetits")
public List<String> initializeAppetits() {
return appetitService.findAll();
}
/**
* This method will provide Faiblesse list to views
*/
@ModelAttribute("faiblesses")
public List<String> initializeFaiblesses() {
return faiblesseService.findAll();
}
/**
* This method will provide Douleur list to views
*/
@ModelAttribute("douleurs")
public List<String> initializeDouleurs() {
return douleurService.findAll();
}
/**
* This method will provide Boules list to views
*/
@ModelAttribute("boules")
public List<String> initializeBoules() {
return bouleService.findAll();
}
/**
* This method handles Access-Denied redirect.
*/
@RequestMapping(value = "/Access_Denied", method = RequestMethod.GET)
public String accessDeniedPage(ModelMap model) {
model.addAttribute("loggedinuser", getPrincipal());
return "accessDenied";
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginPage() {
if (isCurrentAuthenticationAnonymous()) {
return "login";
} else {
return "redirect:/list";
}
}
@RequestMapping(value = "/logout", method = RequestMethod.GET)
public String logoutPage(HttpServletRequest request, HttpServletResponse response) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
// new SecurityContextLogoutHandler().logout(request, response,
// auth);
persistentTokenBasedRememberMeServices.logout(request, response, auth);
SecurityContextHolder.getContext().setAuthentication(null);
}
return "redirect:/login?logout";
}
/**
* This method returns the principal[user-name] of logged-in user.
*/
private String getPrincipal() {
String userName = null;
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
userName = ((UserDetails) principal).getUsername();
} else {
userName = principal.toString();
}
return userName;
}
@SuppressWarnings("rawtypes")
private User getUser() {
String username = null;
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
username = ((UserDetails) principal).getUsername();
User usr = userService.findBySSO(username);
return usr;
}
/**
* This method returns true if users is already authenticated [logged-in],
* else false.
*/
private boolean isCurrentAuthenticationAnonymous() {
final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return authenticationTrustResolver.isAnonymous(authentication);
}
/**
* This method will redirect to dashboard
*/
@RequestMapping(value = { "/board" }, method = RequestMethod.GET)
public String tableauBord(ModelMap model, HttpSession session) {
List<User> users = userService.findAllUsers();
// TOTAL des utilisateurs de la base
int totalAdmin = userService.findAllAdmins().size();
int totalDocs = userService.findAllDocs().size();
int totalPatients = userService.findAllPatients().size();
// ANNEE COURANTE
int year = Calendar.getInstance().get(Calendar.YEAR);
StringBuilder sbyear = new StringBuilder();
sbyear.append(year);
// RECHERCHER LES COMPTES PAR TYPE DE L'ANNEE EN COURS
List<Object[]> totalComptesAdminParMois = userService
.findAllUsersByTypeAndyear(UserProfileType.ADMINISTRATEUR.getUserProfileType(), sbyear.toString());
List<Object[]> totalComptesDocParMois = userService
.findAllUsersByTypeAndyear(UserProfileType.ADMINISTRATEUR.getUserProfileType(), sbyear.toString());
List<Object[]> totalComptesPatParMois = userService
.findAllUsersByTypeAndyear(UserProfileType.UTILISATEUR.getUserProfileType(), sbyear.toString());
return "board";
}
}
堆栈跟踪
严重:上下文初始化失败
org.springframework.beans.factory.BeanCreationException:错误
创建名为“appConfig”的bean:自动连线的注入
依赖关系失败;嵌套异常是
org.springframework.beans.factory.BeanCreationException:无法
自动连线字段:
com.vivalio.springmvc.converter.RoleToUserProfileConverter
com.vivalio.springmvc.configuration.AppConfig.roleToUserProfileConverter;
嵌套异常是
org.springframework.beans.factory.BeanCreationException:错误
创建名为“roleToUserProfileConverter”的bean:注入
自动连线依赖失败;嵌套异常是
org.springframework.beans.factory.BeanCreationException:无法
autowire字段:com.vivalio.springmvc.service.UserProfileService
com.vivalio.springmvc.converter.RoleToUserProfileConverter.userProfileService;
嵌套异常是
org.springframework.beans.factory.BeanCreationException:错误
创建名为“userProfileService”的bean:自动连线的注入
依赖关系失败;嵌套异常是
org.springframework.beans.factory.BeanCreationException:无法
autowire字段:com.vivalio.springmvc.dao.UserProfileDao
com.vivalio.springmvc.service.UserProfileServiceImpl.dao;嵌套
例外情况为org.springframework.beans.factory.BeanCreationException:
创建名为“userProfileDao”的bean时出错:自动连线的注入
依赖关系失败;嵌套异常是
org.springframework.beans.factory.BeanCreationException:无法
autowire字段:private org.hibernate.SessionFactory
com.vivalio.springmvc.dao.AbstractDao.sessionFactory;嵌套异常
是org.springframework.beans.factory.BeanCreationException:错误
创建在类路径中定义了名为“sessionFactory”的bean
资源
[com/vivalio/springmvc/configuration/HibernateConfiguration.class]:
调用init方法失败;嵌套异常是
java.lang.ClassCastException:
无法将org.hibernate.mapping.SingleTableSubclass强制转换为
org.hibernate.mapping.RootClass位于
org.springframework.beans.factory.annotation.AutoWiredNotationBeanPostProcessor.PostProcessPropertyValue(AutoWiredNotationBeanPostProcessor.java:334)
这就是异常的根本原因:
org.hibernate.mapping.SingleTableSubclass cannot be cast to org.hibernate.mapping.RootClass
这意味着在子类和父类中都有@Id
从两个子类中删除@Id
字段,它们将从父类继承该字段
第二个问题是,@JoinColumn
与@Id
同名
@ManyToOne
@JoinColumn(name = "doc_id") // give some unique column name here
private Docteur doc;
p.S.与问题无关的小建议:
您的
控制器中有10个+@Autowired
依赖项。这真的不是设计类的好方法。每次在一个类中观察到太多的@Autowired
依赖项时,都会引发您对应用程序设计的思考-这个类承担了太多的责任。这是异常的根本原因:
org.hibernate.mapping.SingleTableSubclass cannot be cast to org.hibernate.mapping.RootClass
这意味着在子类和父类中都有@Id
从两个子类中删除@Id
字段,它们将从父类继承该字段
第二个问题是,@JoinColumn
与@Id
同名
@ManyToOne
@JoinColumn(name = "doc_id") // give some unique column name here
private Docteur doc;
p.S.与问题无关的小建议:
您的控制器中有10个+@Autowired
依赖项。这真的不是设计类的好方法。每次在一个类中观察到太多的@Autowired
依赖项时,都会引发您对应用程序设计的思考-这个类承担了太多的责任。要理解这个问题,需要配置类和stacktrace。@Badabom,提供正在使用AppConfigBean的代码和bean定义代码well@J-Alex我已经添加了堆栈跟踪和配置class@AnilKumarAthuluri我添加了appConfig类和stacktrace以了解问题-需要配置类和stacktrace。@Badabom,提供正在使用AppConfigBean的代码和bean定义代码well@J-Alex我已经添加了堆栈跟踪和配置class@AnilKumarAthuluri我已经添加了appConfig类和StackTraceA。在从两个子类中删除Id字段后,我仍然存在以下错误:由以下原因引起:org.hibernate.MappingException:实体映射中的重复列:com.vivalio.springmvc.model.Patient column:id(应使用insert=“false”update=“false”进行映射)以下是堆栈跟踪:原因:org.springframework.beans.factory.BeanCreationException:创建名为“sessionFactory”的bean时出错,该bean在类路径资源中定义[com/vivalio/springmvc/configuration/HibernateConfiguration.class]:init方法调用失败;嵌套异常为org.hibernate.MappingException:实体映射中的重复列:com.vivalio.springmvc.model.Patient column:id(应使用insert=“false”update=“false”映射)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.i在尝试身份验证时,假设我的数据库中只有两个id不同的用户:由:org.hibernate.ErrorClassException:Object[id=1]引起不是指定的子类[com.vivalio.springmvc.model.User]:Discriminator:在org.hibernate.loader.loader.getInstanceClass(loader.java:1770)你肯定应该发布一个新问题,我