【问题标题】:Spring - Many To One - phonebook assigning contacts to userSpring - 多对一 - 将联系人分配给用户的电话簿
【发布时间】:2017-08-10 07:55:04
【问题描述】:

我是java和spring的新手。我的第一个练习是模拟网络电话簿的项目。我坚持将联系人分配给特定用户,然后再显示该特定用户的联系人。任何想法或指南都表示赞赏。

用户类

@Entity
public class User implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

private String name;
private String lastName;
private String email;
private String username;
private String password;


@Transient
private String retypePassword;

@ManyToMany(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
@JoinTable(name="users_roles",
    joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")},
    inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="roles_id")}
)
private List<Rolee> authorities;


@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "userForPhonebook")
@Fetch(value = FetchMode.SUBSELECT)
private Collection<Contact> allContacts;

// getters and setters

联系班级

@Entity
public class Contact implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int contactID;

private String name;
private String lastName;
private String email;
private String areaCode;
private String telNumber;
private String adress;
private String city;
private String note;
private String contactImage;

@JoinColumn(name = "users_id")
@ManyToOne(fetch = FetchType.EAGER, optional = false)
private User userForPhonebook;

// getters and setters

ContactServiceImpl 类

@Service
public class ContactServiceImpl implements ContactService {

@Autowired
private ContactDAO contactDAO;

@Autowired
private UserDAO userDAO;

@Autowired
private ServletContext context;

@Override
public void addContact(ContactModel contactModel, MultipartFile[] contactImages, User user) {

    Contact contact = new Contact();

    /*
    creating contact
    */ 

    User user2 = userDAO.userGetById(user.getId()); //<-- i cant get user id
    contact.setUserForPhonebook(user2);

    // --------------------------------

    User u = new User();                //
    u.setId(2);                         // hard coding users id... 
    contact.setUserForPhonebook(u);     // and its working fine

   //  rest of code to create contact ...

用户DAOImpl

// ...
@Override
public void addUser(User user) {

    Session s = getCurrentSession();
    Transaction trans = s.beginTransaction();
    getCurrentSession().save(user);
    trans.commit();

}
// ... 

用户服务实现

// ...
@Override
public void addUser(UserModel userModel) {

    User user = new User();

    // creating user ...

    getUserDAO().addUser(user);
}
// ...

注册控制器

// ...
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String postRegister(@Valid @ModelAttribute("newUser") UserModel userModel, BindingResult results, ModelMap model) {

    if (results.hasErrors()) {
        return "addUser";
    }

    // checking if username, email exist in database ... 
    // password matching


    getUserService().addUser(user);

    return "index";
}
// ...

联系人控制器

// ...
@RequestMapping(value = "/addContact", method = RequestMethod.POST)
public String postAddContact(@Valid @ModelAttribute("addContact") ContactModel contactModel, BindingResult results, HttpServletRequest request, @RequestParam("contactImages") MultipartFile[] contactImages, User user)
        throws FileNotFoundException, IOException  {

    if (results.hasErrors()) {
        return "addContact";
    }

    getContactService().addContact(contactModel, contactImages, user);

    return "redirect:phoneBook";
}
//...

【问题讨论】:

  • 当你保存你的用户时,你是在更新你的本地对象吗?喜欢user = userDao.save(user);int id = userDao.save(user); user.setId(id);,然后将它们发送到addContact?。最好在你的控制器中有一个使用示例。
  • 我也在尝试使用 get.Principal 的活动用户,但我无法将其投射给我的用户。我知道主体通常用于用户名和密码,但我不得不尝试:)
  • 说“我被卡住了”并张贴一堵代码并不是很清楚。您面临的具体问题是什么?
  • @JBNizet 我试图在用户添加新联系人时将联系人绑定到用户,所以当打开电话簿时,它只显示特定用户的联系人

标签: spring


【解决方案1】:

here 的答案帮助我将当前活跃的用户分配给联系人,我的 postAddContact 看起来像这样。抱歉,如果我没有正确提出问题,我希望这对其他人有帮助

@RequestMapping(value = "/addContact", method = RequestMethod.POST)
public String postAddContact(@Valid @ModelAttribute("addContact") ContactModel contactModel, BindingResult results, HttpServletRequest request, @RequestParam("contactImages") MultipartFile[] contactImages)
        throws FileNotFoundException, IOException  {

    if (results.hasErrors()) {
        return "addContact";
    }

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    UserDetails userDetail = (UserDetails) auth.getPrincipal();

    User u = userDAO.getUserByUsername(userDetail.getUsername());
    request.getSession().setAttribute("id", u.getId());

    int userId = (int) request.getSession().getAttribute("id");

    User user = new User();
    user.setId(userId);


    getContactService().addContact(contactModel, contactImages, user);

    return "redirect:phoneBook";
}

【讨论】:

    【解决方案2】:

    您没有指定 Spring 应该如何在您的 postAddContact 签名中绑定您的 User 对象。

    @RequestMapping(value = "/addContact", method = RequestMethod.POST)
    public String postAddContact(
            // Ok, this is a model retrieved from request params
            @Valid @ModelAttribute("addContact") ContactModel contactModel,
    
            // Ok, a BindingResult is mapped when the validation above occurs
            BindingResult results,
    
            // Ok, bind the internal HttlServletRequest
            HttpServletRequest request,
    
            // Ok, bind this to the multipart part of the request
            @RequestParam("contactImages") MultipartFile[] contactImages,
    
            // ... no idea how to bind this
            User user)
    
            throws FileNotFoundException, IOException  {
        // ...
    }
    

    您需要自己指定要获取联系人的用户。

    您可以在 ContactModel 对象中添加字段,例如 userId,然后在控制器中从数据库中检索该用户,然后再添加联系人。

    ContactController.java

    // ...
    @RequestMapping(value = "/addContact", method = RequestMethod.POST)
    public String postAddContact(@Valid @ModelAttribute("addContact") ContactModel contactModel, BindingResult results, HttpServletRequest request, @RequestParam("contactImages") MultipartFile[] contactImages)
            throws FileNotFoundException, IOException  {
    
        if (results.hasErrors()) {
            return "addContact";
        }
    
        // Retrieve the user
        User user = getUserService().retrieveUser(contactModel.getUserId());
    
        getContactService().addContact(contactModel, contactImages, user);
    
        return "redirect:phoneBook";
    }
    //...
    

    您还可以添加路径变量,使用已连接用户等。以上代码只是一个建议。

    【讨论】:

    • 感谢 kagmole 的回答。我尝试了你的建议,但在 DB 中创建联系人后,我的 userId 总是为 0(零)。我认为我的方法 getUserById 没有得到正确的 userId,因为在调试中 userId 始终为 0。我要看看为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多