My Spring应用程序依赖于在应用程序启动之前需要设置的某些环境变量。
例如。考虑以下控制器:
@Controller
public class FileUploadController {
/** Path to which all data will be uploaded **/
private Path appDataPath;
public FileUploadController(){
// Extract the App Data path from environment variables
Map<String, String> environmentVariables = System.getenv();
if (environmentVariables.containsKey("MYAPP_DATA_DIR")) {
String dataPath = environmentVariables.get("MYAPP_DATA_DIR");
appDataPath = Paths.get(dataPath);
} else {
// TODO: Throw an exception to terminate app
}
}
}
我需要在上面的代码中引入什么异常来终止应用程序启动?
答案 0 :(得分:3)
您正在使事情变得复杂,或者只是为路径注入String
并使用@Value
注释或注入Environment
并使用getRequiredProperty
其中任何一个将自动终止应用程序的启动。
@Controller
public class FileUploadController {
@Value("${MYAPP_DATA_DIR}"
private String dataPath;
private Path appDataPath;
@PostConstruct
public void init() {
appDataPath = Paths.get(dataPath);
}
}
或者只是在Environment
方法中使用@PostConstruct
抽象。
@Controller
public class FileUploadController {
@Autowired
private Environment env;
private Path appDataPath;
@PostConstruct
public void init() {
appDataPath = Paths.get(env.getRequiredProperty("MYAPP_DATA_DIR"));
}
}
未定义属性时,两者都会自动爆炸。
答案 1 :(得分:-1)
Spring Framework是Java Enterprise Container的一个实现!
根据Java Enterprise Containers的定义,您需要抛出RuntimeException的子类!它们不需要由容器或调用代码处理。
如果您的强制环境变量未设置且您的应用程序根本无法启动,则需要通知并退出。
我会从RuntimeException创建一个SubClass异常并使用该Exception类!
如果你的spring Framework实现有一些严格的要求(即RuntimeException的一些Spring子类,ApplicationException ...),那么你可以继承该类。但我不认为春天在这个问题上是限制性的......