在我的应用程序中,我在更新我的帐户时遇到了麻烦,请建议吗?
IM构建了到目前为止仅着重于与JPA存储库相互作用的相互作用的CRUD操作的应用程序,以将信息保存到MySQL中持有的数据库中。试图更新ACCOUTN时,我会收到以下错误
java.lang.UnsupportedOperationException: null
at java.base/java.util.AbstractList.remove(AbstractList.java:167) ~[na:na]
at java.base/java.util.AbstractList$Itr.remove(AbstractList.java:387) ~[na:na]
at java.base/java.util.AbstractList.removeRange(AbstractList.java:598) ~[na:na]
at java.base/java.util.AbstractList.clear(AbstractList.java:243) ~[na:na]
at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:580) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.type.CollectionType.replace(CollectionType.java:757) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.type.TypeHelper.replace(TypeHelper.java:167) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:450) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:205) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:178) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:70) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:829) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:816) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:362) ~[spring-orm-5.3.20.jar:5.3.20]
at jdk.proxy4/jdk.proxy4.$Proxy111.merge(Unknown Source) ~[na:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) ~[spring-orm-5.3.20.jar:5.3.20]
at jdk.proxy4/jdk.proxy4.$Proxy111.merge(Unknown Source) ~[na:na]
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:669) ~[spring-data-jpa-2.7.0.jar:2.7.0]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:529) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:639) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:163) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.20.jar:5.3.20]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.20.jar:5.3.20]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) ~[spring-data-jpa-2.7.0.jar:2.7.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.20.jar:5.3.20]
at jdk.proxy4/jdk.proxy4.$Proxy115.save(Unknown Source) ~[na:na]
at com.example.realtyKing.Service.UserServiceImpl.updateUser(UserServiceImpl.java:100) ~[classes/:na]
at com.example.realtyKing.Controller.UserController.update(UserController.java:210) ~[classes/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
我的用户模型
import lombok.*;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.sql.Date;
import java.util.*;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "user", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@Column(nullable = false)
private Date dob;
@Column(name = "phone_number", nullable = false)
private String phoneNumber;
private String email;
private String password;
@Column(name = "email_config")
private String emailConfig;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(
name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(
name = "role_id", referencedColumnName = "id"))
private Collection < Role > roles;
public User(String firstName, String lastName,Date dob,String phoneNumber, String email, String password, Collection < Role > roles) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.dob = dob;
this.phoneNumber=phoneNumber;
this.email = email;
this.password = password;
this.roles = roles;
}
public void urdToUser(UserRegistrationDto urd){
setFirstName(urd.getFirstName());
setLastName(urd.getLastName());
setDob(urd.getDob());
setPhoneNumber(urd.getPhoneNumber());
setEmail(urd.getEmail());
setPassword(urd.getPassword());
}
}
库
import com.example.realtyKing.Model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long>{
User findByEmail(String email);
User findByPassword(String password);
void deleteById(long id);
User findById(long id);
}
我的用户我的服务
import com.example.realtyKing.Model.UserRegistrationDto;
import com.example.realtyKing.Model.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import java.util.List;
public interface UserService extends UserDetailsService{
List < User > getAllUsers();
User getUserById(long id);
void deleteById(long id);
User save(UserRegistrationDto registrationDto);
User getUserByEmail(String email);
User getUserByPassword(String password);
void updateUser(User user);
}
import java.util.List;
import java.util.Arrays;
import java.util.Collection;
import java.util.stream.Collectors;
import com.example.realtyKing.Model.UserRegistrationDto;
import com.example.realtyKing.Model.Role;
import com.example.realtyKing.Model.User;
import com.example.realtyKing.Repositories.UserRepository;
import com.example.realtyKing.Utility.MiscleaniousServices;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
@Autowired
MiscleaniousServices miscleaniousServices;
@Autowired
public void setUserRepository (UserRepository userRepository) {
this.userRepository= userRepository;
}
public UserServiceImpl(UserRepository userRepository) {
super();
this.userRepository = userRepository;
}
@Override
public List <User> getAllUsers() {
return userRepository.findAll();
}
@Override
public User getUserById(long id) {
User user= this.userRepository.findById(id);
return user;
}
@Override
public void deleteById(long id) {
this.userRepository.deleteById(id);
}
@Override
public User save(UserRegistrationDto registrationDto) {
User user = new User(registrationDto.getFirstName(),registrationDto.getLastName(),
registrationDto.getDob(),registrationDto.getPhoneNumber(),registrationDto.getEmail(),
miscleaniousServices.bCryptPasswordEncoder().encode(registrationDto.getPassword()), Arrays.asList(new Role("ROLE_USER")));
return userRepository.save(user);
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByEmail(username);
if(user == null) {
throw new UsernameNotFoundException("Invalid username or password.");
}
return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), mapRolesToAuthorities(user.getRoles()));
}
private Collection<? extends GrantedAuthority> mapRolesToAuthorities(Collection<Role> roles){
return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList());
}
@Override
public User getUserByEmail(String email){
User user = userRepository.findByEmail(email);
if(user!=null)
{
return user;
}
return null;
}
@Override
public User getUserByPassword(String password){
User user = userRepository.findByPassword(password);
if(user!=null)
{
return user;
}
return null;
}
@Override
public void updateUser(User user){
user.setPassword(miscleaniousServices.bCryptPasswordEncoder().encode(user.getPassword()));
user.setRoles(Arrays.asList(new Role("ROLE_USER")));
userRepository.save(user);
}
}
我的服务我控制器请注意,请求将发布更新
import com.example.realtyKing.Model.Mail;
import com.example.realtyKing.Model.UserAuthentification;
import com.example.realtyKing.Model.User;
import com.example.realtyKing.Model.UserRegistrationDto;
import com.example.realtyKing.Service.EmailService;
import com.example.realtyKing.Service.UserService;
import com.example.realtyKing.Utility.MiscleaniousServices;
import com.example.realtyKing.Utility.UserCreationValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.util.Locale;
//fix the id problem.
@Controller
public class UserController {
@Autowired
private EmailService emailService;
@Autowired
private UserService userService;
@Autowired
MiscleaniousServices miscleaniousServices;
@Autowired
private UserCreationValidator userCreationValidator;
@ModelAttribute("user")
public UserRegistrationDto userRegistrationDto() {
return new UserRegistrationDto();
}
@GetMapping("/registration")
public String userAuthentificationForm(Model model)
{
model.addAttribute("firstNameError", "");
model.addAttribute("lastNameError", "");
model.addAttribute("dobError", "");
model.addAttribute("phoneNumberError", "");
model.addAttribute("emailError", "");
model.addAttribute("passwordError", "");
model.addAttribute("user", miscleaniousServices.user());
return "new_user";
}
//finsihed user sighnup
@PostMapping("/registration")
public String userAuthentificationForm(@ModelAttribute("user") UserRegistrationDto registrationDto,
BindingResult bindingResult,Model model) {
userCreationValidator.validate(registrationDto,bindingResult,false);
if (bindingResult.hasErrors()) {
String emailError="";
String dobError="";
String phoneNumberError="";
String firstNameError ="";
String lastNameError="";
String passwordError="";
userFilter(emailError, dobError, phoneNumberError,
firstNameError , lastNameError, passwordError,bindingResult);
model.addAttribute("firstNameError", firstNameError);
model.addAttribute("lastNameError", lastNameError);
model.addAttribute("dobError", dobError);
model.addAttribute("phoneNumberError", phoneNumberError);
model.addAttribute("emailError", emailError);
model.addAttribute("passwordError", passwordError);
model.addAttribute("User", miscleaniousServices.user());
return "new_user";
}
userService.save(registrationDto);
return "redirect:/login";
}
//fixed get login.
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/")
public String home() {
return "index";
}
@GetMapping("/deleteConfirmation")
public String deleteConfirmation(Model model){
UserAuthentification ua=new UserAuthentification();
model.addAttribute("errors","");
model.addAttribute("UserAuthentification",ua);
return "delete_confirmation.html";
}
@PostMapping("/delete")
public String delete(@ModelAttribute("UserAuthentification") UserAuthentification userAuthentification
,Model model) throws Exception {
if(userAuthentification.getUsername().equals("")){
model.addAttribute("email", "");
model.addAttribute("errors","Invalid username or password.");
return "delete_confirmation.html";
}
User user=null;
try{
user=userService.getUserByEmail(userAuthentification.getUsername());
}
catch(Exception e){
}
if(user==null){
model.addAttribute("email", " ");
model.addAttribute("errors","Invalid username or password.");
return "delete_confirmation.html";
}
if(! miscleaniousServices.bCryptPasswordEncoder().matches(userAuthentification.getPassword(), user.getPassword())){
model.addAttribute("email", user.getEmail());
model.addAttribute("errors","Invalid username or password.");
return "delete_confirmation.html";
}
userService.deleteById(user.getId());
return "redirect:/logout";
}
@GetMapping("/forgotPassword")
public String forgotPassword(Model model){
User user=new User();
model.addAttribute("user", user);
model.addAttribute("confirmation", "");
return "forgot_password";
}
@PostMapping("/forgotPassword")
public String forgotPassword(@ModelAttribute("User") User user,Model model) {
try{
user=userService.getUserByEmail(user.getEmail());
Mail mail = new Mail();
mail.setFrom("[email protected]");//replace with your desired email
mail.setMailTo(user.getEmail());//replace with your desired email
emailService.remeberPassword(user,mail);
}
catch(Exception e)
{
model.addAttribute("User", user);
model.addAttribute("confirmation", "their was a problem.");
return "forgot_password";
}
model.addAttribute("User", user);
model.addAttribute("confirmation", "email sent"+
" password soon");
return "forgot_password";
}
@GetMapping("update")
public String update(Model model){
User user=userService.getUserByEmail(miscleaniousServices.getUsername());
UserRegistrationDto urd=new UserRegistrationDto();
urd.userToUrd(user);
model.addAttribute("firstNameError", "");
model.addAttribute("lastNameError", "");
model.addAttribute("dobError", "");
model.addAttribute("phoneNumberError", "");
model.addAttribute("emailError", "");
model.addAttribute("passwordError", "");
model.addAttribute("user", user);
model.addAttribute("message", " ");
return "update";
}
@PostMapping("update")
public String update(@ModelAttribute("user") UserRegistrationDto registrationDto,
BindingResult bindingResult,Model model) {
userCreationValidator.validate(registrationDto,bindingResult,true);
if (bindingResult.hasErrors()) {
String emailError="";
String dobError="";
String phoneNumberError="";
String firstNameError ="";
String lastNameError="";
String passwordError="";
userFilter(emailError, dobError, phoneNumberError,
firstNameError , lastNameError, passwordError,bindingResult);
model.addAttribute("firstNameError", firstNameError);
model.addAttribute("lastNameError", lastNameError);
model.addAttribute("dobError", dobError);
model.addAttribute("phoneNumberError", phoneNumberError);
model.addAttribute("emailError", emailError);
model.addAttribute("passwordError", passwordError);
model.addAttribute("message", "your account has not been succesfully updated.");
model.addAttribute("User", registrationDto);
return "update";
}
User user=userService.getUserByEmail(miscleaniousServices.getUsername());
user.urdToUser(registrationDto);
userService.updateUser(user);
model.addAttribute("firstNameError", "");
model.addAttribute("lastNameError", "");
model.addAttribute("dobError", "");
model.addAttribute("phoneNumberError", "");
model.addAttribute("emailError", "");
model.addAttribute("passwordError", "");
model.addAttribute("user", registrationDto);
model.addAttribute("message", "your account has been succesfully updated.");
return "update";
}
public void userFilter(String emailError,
String dobError,
String phoneNumberError,
String firstNameError ,
String lastNameError,
String passwordError,BindingResult bindingResult){
try {
firstNameError = miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("firstName", bindingResult), null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
lastNameError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("lastName",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
dobError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("dob",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
phoneNumberError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("phoneNumber",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
emailError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("email",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
passwordError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("password",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
}
}
Im building the application that so far only focuses on reletive crud operations interacting with a jpa repository to save info to a database held in mysql.When trying to update an accoutn i get the following error
java.lang.UnsupportedOperationException: null
at java.base/java.util.AbstractList.remove(AbstractList.java:167) ~[na:na]
at java.base/java.util.AbstractList$Itr.remove(AbstractList.java:387) ~[na:na]
at java.base/java.util.AbstractList.removeRange(AbstractList.java:598) ~[na:na]
at java.base/java.util.AbstractList.clear(AbstractList.java:243) ~[na:na]
at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:580) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.type.CollectionType.replace(CollectionType.java:757) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.type.TypeHelper.replace(TypeHelper.java:167) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:450) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:205) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:178) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:70) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:829) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:816) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:362) ~[spring-orm-5.3.20.jar:5.3.20]
at jdk.proxy4/jdk.proxy4.$Proxy111.merge(Unknown Source) ~[na:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) ~[spring-orm-5.3.20.jar:5.3.20]
at jdk.proxy4/jdk.proxy4.$Proxy111.merge(Unknown Source) ~[na:na]
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:669) ~[spring-data-jpa-2.7.0.jar:2.7.0]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:529) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:639) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:163) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.7.0.jar:2.7.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.20.jar:5.3.20]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.20.jar:5.3.20]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) ~[spring-data-jpa-2.7.0.jar:2.7.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.20.jar:5.3.20]
at jdk.proxy4/jdk.proxy4.$Proxy115.save(Unknown Source) ~[na:na]
at com.example.realtyKing.Service.UserServiceImpl.updateUser(UserServiceImpl.java:100) ~[classes/:na]
at com.example.realtyKing.Controller.UserController.update(UserController.java:210) ~[classes/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
my user model
import lombok.*;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.sql.Date;
import java.util.*;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "user", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@Column(nullable = false)
private Date dob;
@Column(name = "phone_number", nullable = false)
private String phoneNumber;
private String email;
private String password;
@Column(name = "email_config")
private String emailConfig;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(
name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(
name = "role_id", referencedColumnName = "id"))
private Collection < Role > roles;
public User(String firstName, String lastName,Date dob,String phoneNumber, String email, String password, Collection < Role > roles) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.dob = dob;
this.phoneNumber=phoneNumber;
this.email = email;
this.password = password;
this.roles = roles;
}
public void urdToUser(UserRegistrationDto urd){
setFirstName(urd.getFirstName());
setLastName(urd.getLastName());
setDob(urd.getDob());
setPhoneNumber(urd.getPhoneNumber());
setEmail(urd.getEmail());
setPassword(urd.getPassword());
}
}
my repository
import com.example.realtyKing.Model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long>{
User findByEmail(String email);
User findByPassword(String password);
void deleteById(long id);
User findById(long id);
}
my service and service impl
import com.example.realtyKing.Model.UserRegistrationDto;
import com.example.realtyKing.Model.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import java.util.List;
public interface UserService extends UserDetailsService{
List < User > getAllUsers();
User getUserById(long id);
void deleteById(long id);
User save(UserRegistrationDto registrationDto);
User getUserByEmail(String email);
User getUserByPassword(String password);
void updateUser(User user);
}
import java.util.List;
import java.util.Arrays;
import java.util.Collection;
import java.util.stream.Collectors;
import com.example.realtyKing.Model.UserRegistrationDto;
import com.example.realtyKing.Model.Role;
import com.example.realtyKing.Model.User;
import com.example.realtyKing.Repositories.UserRepository;
import com.example.realtyKing.Utility.MiscleaniousServices;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
@Autowired
MiscleaniousServices miscleaniousServices;
@Autowired
public void setUserRepository (UserRepository userRepository) {
this.userRepository= userRepository;
}
public UserServiceImpl(UserRepository userRepository) {
super();
this.userRepository = userRepository;
}
@Override
public List <User> getAllUsers() {
return userRepository.findAll();
}
@Override
public User getUserById(long id) {
User user= this.userRepository.findById(id);
return user;
}
@Override
public void deleteById(long id) {
this.userRepository.deleteById(id);
}
@Override
public User save(UserRegistrationDto registrationDto) {
User user = new User(registrationDto.getFirstName(),registrationDto.getLastName(),
registrationDto.getDob(),registrationDto.getPhoneNumber(),registrationDto.getEmail(),
miscleaniousServices.bCryptPasswordEncoder().encode(registrationDto.getPassword()), Arrays.asList(new Role("ROLE_USER")));
return userRepository.save(user);
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByEmail(username);
if(user == null) {
throw new UsernameNotFoundException("Invalid username or password.");
}
return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), mapRolesToAuthorities(user.getRoles()));
}
private Collection<? extends GrantedAuthority> mapRolesToAuthorities(Collection<Role> roles){
return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList());
}
@Override
public User getUserByEmail(String email){
User user = userRepository.findByEmail(email);
if(user!=null)
{
return user;
}
return null;
}
@Override
public User getUserByPassword(String password){
User user = userRepository.findByPassword(password);
if(user!=null)
{
return user;
}
return null;
}
@Override
public void updateUser(User user){
user.setPassword(miscleaniousServices.bCryptPasswordEncoder().encode(user.getPassword()));
user.setRoles(Arrays.asList(new Role("ROLE_USER")));
userRepository.save(user);
}
}
my controller please note the request goes to post update
import com.example.realtyKing.Model.Mail;
import com.example.realtyKing.Model.UserAuthentification;
import com.example.realtyKing.Model.User;
import com.example.realtyKing.Model.UserRegistrationDto;
import com.example.realtyKing.Service.EmailService;
import com.example.realtyKing.Service.UserService;
import com.example.realtyKing.Utility.MiscleaniousServices;
import com.example.realtyKing.Utility.UserCreationValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.util.Locale;
//fix the id problem.
@Controller
public class UserController {
@Autowired
private EmailService emailService;
@Autowired
private UserService userService;
@Autowired
MiscleaniousServices miscleaniousServices;
@Autowired
private UserCreationValidator userCreationValidator;
@ModelAttribute("user")
public UserRegistrationDto userRegistrationDto() {
return new UserRegistrationDto();
}
@GetMapping("/registration")
public String userAuthentificationForm(Model model)
{
model.addAttribute("firstNameError", "");
model.addAttribute("lastNameError", "");
model.addAttribute("dobError", "");
model.addAttribute("phoneNumberError", "");
model.addAttribute("emailError", "");
model.addAttribute("passwordError", "");
model.addAttribute("user", miscleaniousServices.user());
return "new_user";
}
//finsihed user sighnup
@PostMapping("/registration")
public String userAuthentificationForm(@ModelAttribute("user") UserRegistrationDto registrationDto,
BindingResult bindingResult,Model model) {
userCreationValidator.validate(registrationDto,bindingResult,false);
if (bindingResult.hasErrors()) {
String emailError="";
String dobError="";
String phoneNumberError="";
String firstNameError ="";
String lastNameError="";
String passwordError="";
userFilter(emailError, dobError, phoneNumberError,
firstNameError , lastNameError, passwordError,bindingResult);
model.addAttribute("firstNameError", firstNameError);
model.addAttribute("lastNameError", lastNameError);
model.addAttribute("dobError", dobError);
model.addAttribute("phoneNumberError", phoneNumberError);
model.addAttribute("emailError", emailError);
model.addAttribute("passwordError", passwordError);
model.addAttribute("User", miscleaniousServices.user());
return "new_user";
}
userService.save(registrationDto);
return "redirect:/login";
}
//fixed get login.
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/")
public String home() {
return "index";
}
@GetMapping("/deleteConfirmation")
public String deleteConfirmation(Model model){
UserAuthentification ua=new UserAuthentification();
model.addAttribute("errors","");
model.addAttribute("UserAuthentification",ua);
return "delete_confirmation.html";
}
@PostMapping("/delete")
public String delete(@ModelAttribute("UserAuthentification") UserAuthentification userAuthentification
,Model model) throws Exception {
if(userAuthentification.getUsername().equals("")){
model.addAttribute("email", "");
model.addAttribute("errors","Invalid username or password.");
return "delete_confirmation.html";
}
User user=null;
try{
user=userService.getUserByEmail(userAuthentification.getUsername());
}
catch(Exception e){
}
if(user==null){
model.addAttribute("email", " ");
model.addAttribute("errors","Invalid username or password.");
return "delete_confirmation.html";
}
if(! miscleaniousServices.bCryptPasswordEncoder().matches(userAuthentification.getPassword(), user.getPassword())){
model.addAttribute("email", user.getEmail());
model.addAttribute("errors","Invalid username or password.");
return "delete_confirmation.html";
}
userService.deleteById(user.getId());
return "redirect:/logout";
}
@GetMapping("/forgotPassword")
public String forgotPassword(Model model){
User user=new User();
model.addAttribute("user", user);
model.addAttribute("confirmation", "");
return "forgot_password";
}
@PostMapping("/forgotPassword")
public String forgotPassword(@ModelAttribute("User") User user,Model model) {
try{
user=userService.getUserByEmail(user.getEmail());
Mail mail = new Mail();
mail.setFrom("[email protected]");//replace with your desired email
mail.setMailTo(user.getEmail());//replace with your desired email
emailService.remeberPassword(user,mail);
}
catch(Exception e)
{
model.addAttribute("User", user);
model.addAttribute("confirmation", "their was a problem.");
return "forgot_password";
}
model.addAttribute("User", user);
model.addAttribute("confirmation", "email sent"+
" password soon");
return "forgot_password";
}
@GetMapping("update")
public String update(Model model){
User user=userService.getUserByEmail(miscleaniousServices.getUsername());
UserRegistrationDto urd=new UserRegistrationDto();
urd.userToUrd(user);
model.addAttribute("firstNameError", "");
model.addAttribute("lastNameError", "");
model.addAttribute("dobError", "");
model.addAttribute("phoneNumberError", "");
model.addAttribute("emailError", "");
model.addAttribute("passwordError", "");
model.addAttribute("user", user);
model.addAttribute("message", " ");
return "update";
}
@PostMapping("update")
public String update(@ModelAttribute("user") UserRegistrationDto registrationDto,
BindingResult bindingResult,Model model) {
userCreationValidator.validate(registrationDto,bindingResult,true);
if (bindingResult.hasErrors()) {
String emailError="";
String dobError="";
String phoneNumberError="";
String firstNameError ="";
String lastNameError="";
String passwordError="";
userFilter(emailError, dobError, phoneNumberError,
firstNameError , lastNameError, passwordError,bindingResult);
model.addAttribute("firstNameError", firstNameError);
model.addAttribute("lastNameError", lastNameError);
model.addAttribute("dobError", dobError);
model.addAttribute("phoneNumberError", phoneNumberError);
model.addAttribute("emailError", emailError);
model.addAttribute("passwordError", passwordError);
model.addAttribute("message", "your account has not been succesfully updated.");
model.addAttribute("User", registrationDto);
return "update";
}
User user=userService.getUserByEmail(miscleaniousServices.getUsername());
user.urdToUser(registrationDto);
userService.updateUser(user);
model.addAttribute("firstNameError", "");
model.addAttribute("lastNameError", "");
model.addAttribute("dobError", "");
model.addAttribute("phoneNumberError", "");
model.addAttribute("emailError", "");
model.addAttribute("passwordError", "");
model.addAttribute("user", registrationDto);
model.addAttribute("message", "your account has been succesfully updated.");
return "update";
}
public void userFilter(String emailError,
String dobError,
String phoneNumberError,
String firstNameError ,
String lastNameError,
String passwordError,BindingResult bindingResult){
try {
firstNameError = miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("firstName", bindingResult), null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
lastNameError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("lastName",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
dobError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("dob",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
phoneNumberError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("phoneNumber",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
emailError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("email",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
try{
passwordError=miscleaniousServices.messageSource().getMessage(
miscleaniousServices.getErrorMessage("password",bindingResult),null, Locale.ENGLISH);
}
catch(Exception e){
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论