У меня есть пружинный класс AppUser, который имеет аннотированное поле @Autowired (FriendList) следующим образом:
@Getter
@Setter
@Builder
@Document(collection = "app_users")
@Component
public class AppUser {
@Id
@NotBlank(message = ErrorConstants.ANDROID_USER_ACCOUNT_MANAGER_ID_IS_NULL)
private String androidUserAccountManagerId;
@NotBlank(message = ErrorConstants.NULL_NAME)
private String name;
private Friend bestFriend;
@Autowired
@Setter(AccessLevel.NONE)
private FriendList friendList;
private boolean manualBestFriendOverride;
public Optional<Friend> getFriend(String friendName) {
return friendList.getFriend(friendName);
}
public void calculateBestFriend() {
if (!manualBestFriendOverride) {
bestFriend = friendList.calculateAndReturnBestFriend();
}
}
}
Идея заключалась в том, что при каждом создании нового AppUser он будет @Autowire одинаковым по умолчанию friendList должен начинаться с нуля.
AppUser создается в методе WebController:
@PostMapping("/{androidUserAccountManagerId}/setNewAppUser/{appUserName}")
public void setNewAppUser(
@NotNull @PathVariable String androidUserAccountManagerId,
@NotNull @PathVariable @Pattern(regexp = "^[A-z]{2,20}$", message = "Incorrect name format!")
String appUserName) {
databaseQueryClass.save(
AppUser.builder()
.androidUserAccountManagerId(androidUserAccountManagerId)
.name(appUserName)
.build());
}
Однако я получаю исключение нулевого указателя, возникающее при вызове поля FriendList в другие методы. По сути, кажется, что автопроводка не работает в связке со сборщиком AppUser.
После некоторого чтения кажется плохой практикой вызывать new или build и autowire поле в создаваемом классе из-за Io C и Dependency Injection, отсортированные по Spring.
Мой вопрос: как мне обойти этот дизайн? Возможно ли это сделать? Или я должен прекратить попытки автоматически связать поле в новом экземпляре, который я должен создать? В качестве альтернативы, есть ли способ, которым я могу автоматически подключить нового пользователя при достижении этой конечной точки?
Спасибо за вашу помощь заранее.
Класс FriendList для контекста:
@ToString
@EqualsAndHashCode
@Builder
public class FriendList {
@NotNull private List<Friend> listOfFriends;
public Optional<Friend> getFriend(String friendName) {
return listOfFriends.stream().filter(o -> o.getName().equals(friendName)).findAny();
}
public Friend calculateAndReturnBestFriend() {
if(listOfFriends.isEmpty()){
return null;
}
java.util.Collections.sort(listOfFriends);
return listOfFriends.get(0);
}
public boolean addToFriendList(String friendName) {
if (getFriend(friendName).isPresent()) {
return false;
}
return listOfFriends.add(
Friend.builder().name(friendName).meetingDates(new TreeSet<>()).meetUpNumber(0).build());
}
}
РЕДАКТИРОВАТЬ (Извините, что пропустил этот контекст ...)
У меня определен бин в классе AppConfig:
@Configuration
public class AppConfig {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public FriendList getFriendList() {
return FriendList.builder().listOfFriends(new ArrayList<>()).build();
}
}