尝试使用 JWT "status"执行请求时出错:500,



我使用用户名和密码进行身份验证,之后我会收到一个令牌,以便发送更改数据库中字段的进一步请求。注册成功。身份验证和令牌获取成功。使用特定用户的令牌执行请求时,会出现NULL错误。告诉我可能出了什么问题?为什么它没有在数据库中找到它?也许有一种更方便的方法可以更改数据库,请告诉我

错误和代码:

request:
PUT http://localhost:8080/profile/updated/7
{ "description":"hello world"}
response:
{
"timestamp": "2021-07-16T22:36:57.169+00:00",
"status": 500,
"error": "Internal Server Error",
"path": "/profile/updated/7"
}

REST控制器方法:

@RestController
@RequestMapping(value="/profile")
public class UserActController {
UserServiceActProfile userServiceActProfile;

@Autowired
public UserActController(UserServiceActProfile userServiceActProfile){
this.userServiceActProfile=userServiceActProfile;
}

@RequestMapping(value = { "updated/{id}" },produces = "application/json", method = RequestMethod.PUT)
public ResponseEntity<?> updateDescription (@PathVariable Long id,  @RequestBody  User name ){
return userServiceActProfile.updateDescription(id,name);
}

服务:

@Service
public class UserServiceActProfile {

UserRepository userRepository;
public ResponseEntity<?> updateDescription(Long id, User ds){
User user = userRepository.findById(id).get();
user.setDescription(ds.getDescription());
userRepository.save(user);

return ResponseEntity.ok(new MessageResponse("Description update!"));
}

}

存储库:

public interface UserRepository extends JpaRepository<User, Long>{

User findByUsername(String name);
User findByEmail(String name);
Optional<User> findById(Long Id);

}

配置:

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


private static final String LOGIN_ENDPOINT = "/auth/**";

@Autowired
private  JwtTokenProvider jwtTokenProvider;

@Autowired
private PasswordEncoder passwordEncoder;

@Autowired
private JwtUserService jwtUserService;


@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}

@Override
protected void configure(HttpSecurity http) throws Exception {

http 
.httpBasic().disable()
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers(LOGIN_ENDPOINT).permitAll()       
.anyRequest().authenticated()
.and()
.apply(new JwtConfigurer(jwtTokenProvider))
.and()
.logout()
.permitAll();

}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(jwtUserService)

.passwordEncoder(passwordEncoder);
}   

}

错误:

ava.lang.NullPointerException: Cannot invoke "com.op.springboot.repository.UserRepository.findById(java.lang.Long)" because "this.userRepository" is null] with root cause
java.lang.NullPointerException: Cannot invoke "com.op.springboot.repository.UserRepository.findById(java.lang.Long)" because "this.userRepository" is null
at com.op.springboot.service.UserServiceActProfile.updateDescription(UserServiceActProfile.java:16) ~[classes/:na]
at com.op.springboot.controller.UserActController.updateDescription(UserActController.java:34) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.8.jar:5.3.8]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.8.jar:5.3.8]

新的NPE错误消息告诉您什么是空以及在哪里。您没有在任何位置初始化userRepository;就像在控制器中一样,您需要一个构造函数(如果一个类只有一个构造函数,则不需要@Autowired(。

一般来说,使依赖字段像userRepositoryfinal是一种很好的做法;如果添加final,编译器会告诉您没有在任何地方初始化它。

相关内容

最新更新