Как уничтожить или очистить состояние объекта Bean при каждом использовании в весенней загрузке - PullRequest
0 голосов
/ 02 февраля 2020

Я новичок в весенней загрузке и пытаюсь выяснить, когда мы создаем bean-компонент с помощью @Bean, и пытаюсь получить доступ к этому bean-компоненту везде, где это требуется с помощью @Autowired. Но я знаю, что @Bean по умолчанию одноэлементный, и он сохранит свое состояние, но я хочу очистить его состояние, чтобы оно давало новые вновь добавляемые данные или ноль, если данные не были добавлены. Пожалуйста, помогите мне в этом. И я также хочу знать, что я следую правильному стандарту кодирования, используя Bean с autowired, потому что я хочу, чтобы все мои API давали схожий тип ответа, поэтому я создаю pojo и делаю его bean-компонентом, чтобы мне не пришлось создать объект снова и снова. Извините, если моя проблема глупа .. спасибо заранее

Это мой основной класс

@SpringBootApplication
public class GyftiV2Application {

    public static void main(String[] args) {
        SpringApplication.run(GyftiV2Application.class, args);
    }
    @Bean
    public ResponseData getResponse() {
        return new ResponseData();
    }
}

Ниже находится pojo

public class ResponseData {

    private boolean responce;
    private String error;
    private List<?> data = new ArrayList<>();

    public ResponseData() {
    }

    public boolean isResponce() {
        return responce;
    }

    public void setResponce(boolean responce) {
        this.responce = responce;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }

    public List<?> getData() {
        return data;
    }

    public void setData(List<?> data) {
        this.data = data;
    }
}

Ниже сервис, где использовал мой бин

@Service
public class UserServiceImpl implements UserService {

@Autowired
private ResponseData resData;

@Autowired
private UserRepository userRepository;

public ResponseData changePassword(PasswordChange pass) {
    User user = userRepository.getOne(pass.getUserId());
    if (null != user) {
        if (pass.getOldPassword().equals(user.getUser_password())) {
            if ((pass.getNewPassword().trim()).equals(pass.getConfirmPassword().trim())) {
                user.setUser_password(pass.getNewPassword());
                userRepository.save(user);
                resData.setResponce(true);
                resData.setData(Collections.singletonList("Password change successfully"));
                return resData;
            } else {
                resData.setResponce(false);
                resData.setError("Please write the same new password in the confirm section");
                return resData;
            }
        } else {
            resData.setResponce(false);
            resData.setError("Please write the correct old password");
            return resData;
        }
    } else {
        resData.setResponce(false);
        resData.setError("Something went wrong userId is not correct");
        return resData;
    }
}

}

с контроллером

@RestController
@RequestMapping("/user")
public class UserController {

@Autowired
private UserService userService;

@PostMapping(value = "/changePassword")
    public ResponseEntity<ResponseData> changePassword(@RequestBody PasswordChange pass) {
        ResponseData response = userService.changePassword(pass);
        if (response.isResponce()) {
            return new ResponseEntity<>(response, HttpStatus.OK);
        }
        return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
    }

}

Но когда я не передал тот же newPassoword и verifyPassword, тогда я получил ответ

{
  "responce": false,
  "error": "Please write the same new password in the confirm section",
  "data": []
}

И когда я передаю все правильно, я получаю ответ

{
  "responce": true,
  "error": "Please write the same new password in the confirm section",
  "data": [
    "Password change successfully"
  ]
}

Вы ясно увидите, что resData сохраняет свое состояние, поэтому ключ ошибки все еще существует. Я знаю, если я передам "" в поле ошибки, это исправит эту проблему, но есть ли необходимость очистить состояние @Bean? Спасибо за помощь.

1 Ответ

1 голос
/ 02 февраля 2020

Как сказано в комментарии, вы не должны использовать это как Бин ... Это просто обычный объект.

Вот каков должен быть код вашей услуги:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    public ResponseData changePassword(PasswordChange pass) {
        User user = userRepository.getOne(pass.getUserId());
        if (null != user) {
            if (pass.getOldPassword().equals(user.getUser_password())) {
                if ((pass.getNewPassword().trim()).equals(pass.getConfirmPassword().trim())) {
                    user.setUser_password(pass.getNewPassword());
                    userRepository.save(user);
                    ResponseData resData = new ResponseData();
                    resData.setResponce(true);
                    resData.setData(Collections.singletonList("Password change successfully"));
                    return resData;
                } else {
                    ResponseData resData = new ResponseData();
                    resData.setResponce(false);
                    resData.setData("Please write the same new password in the confirm section");
                    return resData;
                }
            } else {
                ...
            }
        } else {
            ...
        }
    }
}

Примите во внимание:

  • Вы не должны использовать свой сервис для возврата объекта ResponseDate отправлено непосредственно клиенту. Возможно, используйте исключение в вашем сервисе, например PasswordAndConfirmationAreDifferentException. Таким образом, в вашем контроллере проще работать так, как вы хотите.
@RestController
@RequestMapping("/user")
public class UserController {

@Autowired
private UserService userService;

@PostMapping(value = "/changePassword")
    public ResponseEntity<ResponseData> changePassword(@RequestBody PasswordChange pass) {
        try {
            userService.changePassword(pass);
            ResponseData resData = new ResponseData();
            resData.setResponce(true);
            resData.setData(Collections.singletonList("Password change successfully"));
            return new ResponseEntity<>(resData, HttpStatus.OK);
        } catch (PasswordAndConfirmationAreDifferentException e) {
            ResponseData resData = new ResponseData();
            resData.setResponce(false);
            resData.setData("Password incorrect");
            return new ResponseEntity<>(resData, HttpStatus.BAD_REQUEST);
        }
    }
}
  • Используйте построитель, чтобы легко построить responseDate типа Error ResponseData.Error("my error") и типа Data ResponseData .Data ("мое сообщение 1", "мое сообщение2", ...)
...