gpt4 book ai didi

java - 如何在接口(interface)中初始化对象?

转载 作者:行者123 更新时间:2023-12-01 17:53:19 25 4
gpt4 key购买 nike

我有这个 MovieService.java:

@Service
public class MovieService implements MovieInterface {

@Autowired
private MovieRepository movieRepository;

@Autowired
private UserRepository userRepository;

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
JwtUser user = (JwtUser)authentication.getPrincipal();
User current_user = userRepository.findOne(user.getId());

@Override
public Movie createMovie(Movie movie) {

current_user.addMovie(movie);
userRepository.save(current_user);

return movie;
}
}

这是我在编译代码时遇到的错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'movieController': Unsatisfied dependency expressed through field 'movieService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'movieService' defined in file [C:\Users\alucardu\Documents\projects\movieseat\backend\target\classes\com\movieseat\services\MovieService.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.movieseat.services.MovieService]: Constructor threw exception; nested exception is java.lang.NullPointerException

当我将 authenticationusercurrent_user 属性移至 createMovie 方法中时,此问题得到解决。但我想在多个方法中使用 current_user,因此我想将其添加为类成员。

我还实现了一个 MovieInterface:

package com.movieseat.interfaces;

// Java imports
import java.util.List;
import com.movieseat.model.security.User;
// Project imports
import com.movieseat.models.Movie;
import com.movieseat.security.JwtUser;
import org.springframework.security.core.Authentication;

public interface MovieInterface {
List<Movie> getAllmovies();
Movie createMovie(Movie movie);
void deleteMovie(Integer id);
}

所以我想代码可能无法编译,因为接口(interface)中未定义属性authenticationusercurrent_user。尽管我希望类似的事情会出现不同的错误输出。当我将属性添加到界面时:

public interface MovieInterface {
Authentication authentication;
JwtUser user;
User current_user;
List<Movie> getAllmovies();
Movie createMovie(Movie movie);
void deleteMovie(Integer id);
}

我收到消息:

the blank final field authentication may not have been initialized

the blank final field user may not have been initialized

the blank final field current_user may not have been initialized

此消息是有意义的,因为接口(interface)期望字段是最终的。而这些字段没有任何值(value)。所以我的问题是,我可以在界面中标记一个非最终字段吗?如果我必须初始化字段的值,我需要使用什么?

我知道你初始化了一个字段String name = "name";但是这些属性是对象。

User current_user = {};

Cannot convert from Object[] to User

最佳答案

你的服务是一个bean,特别是它是一个单例。这意味着您的应用程序中只有该服务的一个实例。

但它可能被不同的用户调用。因此,您必须createMovie方法中获取当前用户(您已经将其命名为当前用户!)。

当您尝试在 PostConstruct 方法中初始化这些字段时,您将不会有 SecurityContext 并且不会有主体。如果您将当前用户的信息保留在服务实例中,那么所有调用都将代表该用户进行,无论他们来自哪里。

所以最好的事情是创建一个方法:

private getUser() {
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
JwtUser user = (JwtUser)authentication.getPrincipal();
User current_user = userRepository.findOne(user.getId());
return current_user;
}

并从不同的方法中调用它。

关于java - 如何在接口(interface)中初始化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47606445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com