java - 从 api 返回成功为 true 或 false om Spring REST API
问题描述
我对 Springboot 很陌生。如何配置我的 Springboot API 以从我的登录或注册端点返回下面的 JSON 响应?我怎样才能返回真正的成功响应?还有例如,如果代码处理中出现代码异常,我如何返回 false 作为成功的 JSON 响应?
{
'message': "user created successfully",
'success' : true or false depending on the state of the request
}
到目前为止我所拥有的:My login API
@PostMapping("/signin")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {
if (!userRepository.existsByUsername(loginRequest.getUsername()) {
return ResponseEntity
.badRequest()
.body(new MessageResponse("Invalid Login credentials!"));
}else{
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(item -> item.getAuthority())
.collect(Collectors.toList());
return ResponseEntity.ok(new JwtResponse(jwt,
userDetails.getId(),
userDetails.getUsername(),
userDetails.getEmail(),
roles));
}
}
My Signup API
:
@PostMapping("/signup")
public ResponseEntity<?> registerUser(@Valid @RequestBody SignupRequest signUpRequest) {
if (userRepository.existsByUsername(signUpRequest.getUsername())) {
return ResponseEntity
.badRequest()
.body(new MessageResponse("Email is already in use!"));
}
if (userRepository.existsByEmail(signUpRequest.getEmail())) {
return ResponseEntity
.badRequest()
.body(new MessageResponse("Email is already in use!"));
}
// Create new user's account
User user = new User(signUpRequest.getUsername(), signUpRequest.getEmail(),
encoder.encode(signUpRequest.getPassword()),signUpRequest.getFirstname(),
signUpRequest.getSurname(),signUpRequest.getTelephoneno(),
signUpRequest.getWhatsappno());
Set<String> strRoles = signUpRequest.getRole();
Set<Role> roles = new HashSet<>();
if (strRoles == null) {
Role userRole = roleRepository.findByName(ERole.ROLE_USER)
.orElseThrow(() -> new RuntimeException("Role is not found."));
roles.add(userRole);
} else {
strRoles.forEach(role -> {
switch (role) {
case "admin":
Role adminRole = roleRepository.findByName(ERole.ROLE_ADMIN)
.orElseThrow(() -> new RuntimeException("Role is not found."));
roles.add(adminRole);
break;
case "mod":
Role modRole = roleRepository.findByName(ERole.ROLE_MODERATOR)
.orElseThrow(() -> new RuntimeException("Role is not found."));
roles.add(modRole);
break;
default:
Role userRole = roleRepository.findByName(ERole.ROLE_USER)
.orElseThrow(() -> new RuntimeException("Role is not found."));
roles.add(userRole);
}
});
}
user.setRoles(roles);
userRepository.save(user);
return ResponseEntity.ok(new MessageResponse("User registered successfully!"));
//return ResponseEntity.ok(jwt);
}
}
消息响应类
public class MessageResponse {
private String message;
public MessageResponse(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
解决方案
你没有发布 MessageResponse 的代码,所以如果它是你的类,你可以向它添加布尔字段,并且 ResponseEntity<?> 包装器可以包装这个具有 2 个字段的对象。另一种选择是使用@ResponseBody 注释而不是ResponseEntity。请在这里阅读更多
推荐阅读
- python - 迭代列表时,如果字符串不在项目中,则评估一次 - python 3.x
- angular - ngIf 在 mat-table 内的 ng-container 中
- android - CordovaError:项目名称不能以数字开头
- excel-formula - 如何根据多个条件在excel中查找一行
- c - 函数无法多次运行
- c# - 为什么要使用 SerializeField?
- vue.js - 在 vue-cli 构建后,应用程序无法正确呈现
- google-app-engine - GCP App Engine flex (GAE):部署时出错
- c++ - 我想知道我是否可以在一个进程中打开两个管道
- javascript - 如何使用javascript创建一个文本框值数组