【问题标题】:SpringBoot+ ConstructorSpring Boot 构造函数
【发布时间】:2021-04-04 07:04:39
【问题描述】:

它一直给我这个错误,我不知道如何专注于问题或在哪里搜索它一直在问我关于构造函数的问题,但我正在使用 lombok 所以我为什么要构造构造函数,我真的不知道'不知道代码有什么问题。

这是下面的用户模型代码:

package com.muskiltak.v1.model;

import lombok.*;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "users")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name = "username")
private String username;

@Column(name = "email")
private String email;

@Column(name = "phone")
private Integer phone;

@Column(name = "password")
private String password;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable( name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
}

,下面是角色模型代码:

package com.muskiltak.v1.model;

import com.muskiltak.v1.utility.enums.Roles;
import lombok.*;

import javax.persistence.*;

@Entity
@Table(name = "roles")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class Role {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Enumerated(EnumType.STRING)
@Column(name = "name")
private Roles name;
}

这是 AuthController 代码:

package com.muskiltak.v1.controller;

import com.muskiltak.v1.utility.enums.Roles;
import com.muskiltak.v1.model.Role;
import com.muskiltak.v1.model.User;
import com.muskiltak.v1.repository.RoleRepo;
import com.muskiltak.v1.repository.UserRepo;
import com.muskiltak.v1.service.UserDetailsImpl;
import com.muskiltak.v1.utility.JWT.JwtUtils;
import com.muskiltak.v1.utility.payload.request.LoginRequest;
import com.muskiltak.v1.utility.payload.request.RegisterRequest;
import com.muskiltak.v1.utility.payload.response.JwtResponse;
import com.muskiltak.v1.utility.payload.response.MessageResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/v1")
public class AuthController {

@Autowired
AuthenticationManager authenticationManager;

@Autowired
UserRepo userRepository;

@Autowired
RoleRepo roleRepository;

@Autowired
PasswordEncoder encoder;

@Autowired
JwtUtils jwtUtils;


@PostMapping("/login")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {

    Authentication authentication = authenticationManager.authenticate(
            new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));

    SecurityContextHolder.getContext().setAuthentication(authentication);
    String jwt = jwtUtils.generateJwtToken(authentication);

    UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
    List<String> roles = userDetails.getAuthorities().stream()
            .map(GrantedAuthority::getAuthority)
            .collect(Collectors.toList());

    return ResponseEntity.ok(new JwtResponse(jwt,
            userDetails.getId(),
            userDetails.getUsername(),
            userDetails.getEmail(),
            userDetails.getPhone(),
            roles));
}

@PostMapping("/register")
public ResponseEntity<?> registerUser(@Valid @RequestBody RegisterRequest registerRequest) {
    if (userRepository.existsByUsername(registerRequest.getUsername())) {
        return ResponseEntity
                .badRequest()
                .body(new MessageResponse("Error: Username is already taken!"));
    }

    if (userRepository.existsByEmail(registerRequest.getEmail())) {
        return ResponseEntity
                .badRequest()
                .body(new MessageResponse("Error: Email is already in use!"));
    }

    if (userRepository.existsByPhone(registerRequest.getPhone())) {
        return ResponseEntity
                .badRequest()
                .body(new MessageResponse("Error: Phone Number is already in use!"));
    }

    // Create new user's account
    User user = new User(
            registerRequest.getUsername(),
            registerRequest.getEmail(),
            registerRequest.getPhone(),
            encoder.encode(
                    registerRequest.getPassword()
            )
    );

    Set<String> strRoles = registerRequest.getRole();
    Set<Role> roles = new HashSet<>();

    if (strRoles == null) {
        Role userRole = roleRepository.findByName(Roles.USER)
                .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
        roles.add(userRole);
    } else {
        strRoles.forEach(role -> {
            switch (role) {
                case "admin":
                    Role adminRole = roleRepository.findByName(Roles.ADMIN)
                            .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
                    roles.add(adminRole);

                    break;
                case "moderator":
                    Role moderatorRole = roleRepository.findByName(Roles.MODERATOR)
                            .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
                    roles.add(moderatorRole);

                    break;
                case "corp":
                    Role corpRole = roleRepository.findByName(Roles.CORP)
                            .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
                    roles.add(corpRole);

                    break;
                default:
                    Role userRole = roleRepository.findByName(Roles.USER)
                            .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
                    roles.add(userRole);
            }
        });
    }

    user.setRoles(roles);
    userRepository.save(user);

    return ResponseEntity.ok(new MessageResponse("User registered successfully!"));
}
}

一直给我同样的错误,如下图所示,即使我在调试模式下运行它时,它一直要求我创建构造函数并且我正在使用 lombok,如你所见

【问题讨论】:

标签: java spring spring-boot spring-data-jpa spring-data


【解决方案1】:

根据 lombok,将创建的构造函数将具有与定义相同的顺序的所有属性类型。因此,您的 @AllArgsConstructor 注释将创建如下构造函数:

public User(long id, String username, Integer phone, String password, HashSet<Role> roles);

在您的第 94 行中,您尝试向需要 6 的构造函数提供四个值。您可以通过以下可能的方式解决您的问题:

  1. 在 AuthController 的第 94 行中为角色传递一些默认值和空值。
  2. 编写自己需要的构造函数,只需要四个参数。
  3. 删除 @AllArgsConstructor 注释并仅创建所需的构造函数,而不是提供所有参数的构造函数。

【讨论】:

    【解决方案2】:

    您使用的构造函数既不是无参数构造函数,也不是接收所有参数的构造函数。您将用户名、电子邮件、电话和密码传递给您的构造函数。这是User 类的四个字段,但该类有更多字段,因此构造函数与 Lombok 生成的任何构造函数都不匹配。您必须显式编写该构造​​函数或传递适当的参数,以便它匹配 Lombok 生成的构造函数之一。

    【讨论】:

      【解决方案3】:

      您正在使用Lombok 生成两个构造函数: 一种不接受参数,另一种接受所有字段作为参数。您正在调用一个不存在的构造函数,它只采用 User 的一部分字段。

      替换这个:

      // Create new user's account
      User user = new User(
              registerRequest.getUsername(),
              registerRequest.getEmail(),
              registerRequest.getPhone(),
              encoder.encode(
                  registerRequest.getPassword()
              )
      );
      

      下面的代码应该可以工作。

      // Create new user's account
      User user = new User();
      user.setUsername(registerRequest.getUsername());
      user.setEmail(registerRequest.getEmail());
      user.setPhone(registerRequest.getPhone());
      user.setPassword(encoder.encode(registerRequest.getPassword()));
      

      或者,您可以手动将具有这 4 个参数的构造函数添加到 User 类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 2022-11-14
        • 2020-03-18
        • 2016-09-04
        • 1970-01-01
        相关资源
        最近更新 更多