rah*_*l s 5 java spring spring-boot
我正在使用spring boot&作为属性,我已将application.properties放置在src / main / resources中
从@Controllers和@Services,我能够读取属性,但是从我的模型pojo和singleton类中,我无法读取值。
我的@SpringBootApplication位于com.vehicle中,并且我没有覆盖@ComponentScan,所以我相信它应该读取所有基础包。
下面是代码:
application.properties
vehicle.lift.maxWeight=10
vehicle.lift.error.overWeight=Overweight
vehicle.battery.default=5.0
vehicle.battery.critical.limit=15
vehicle.walk.distance.error=Not able to move
Run Code Online (Sandbox Code Playgroud)
WalkServiceImpl.java(可从此处阅读)
package com.vehicle.prototype.service.impl;
@Service
public class WalkServiceImpl implements CapabilityService {
@Value("${vehicle.walk.distance.error}")
private String mDistanceError;
@Override
public void performTask(VehicleData vehicleData) {
double distance = vehicleData.getWalkingDistance();
double remainingBattery = vehicleData.getRemainingBattery();
if (remainingBattery < distance) {
vehicleData.setErrorMessage(mDistanceError);
System.out.println(mDistanceError);
} else {
vehicleData.setRemainingBattery(remainingBattery - distance);
}
VehicleUtil.checkBatteryStatus(vehicleData);
}
}
Run Code Online (Sandbox Code Playgroud)
VehicleData.java(Pojo-无法从此处读取)
package com.vehicle.prototype.model;
public class VehicleData {
private double walkingDistance;
private double liftWeight;
@Value("${vehicle.battery.default}")
private double remainingBattery;
// setters & getters ....
}
Run Code Online (Sandbox Code Playgroud)
VehicleUtil.java(Singleton-无法从此处读取)
package com.vehicle.prototype.utils;
public class VehicleUtil {
private static VehicleUtil mInstance = null;
private static Object mLock = new Object();
@Value("${vehicle.battery.critical.limit}")
private static double mCriticalLimit;
@Value("${vehicle.battery.default}")
private static double mTotalPower;
@Value("${vehicle.battery.critical.warning}")
private static String powerWarning;
private VehicleUtil() {
// empty private constructor.
}
public static VehicleUtil getInstance() {
if (mInstance == null) {
synchronized (mLock) {
if (mInstance == null)
mInstance = new VehicleUtil();
}
}
return mInstance;
}
public static void checkBatteryStatus(VehicleData vehicleData) {
double criticalMark = (mCriticalLimit * 100.0f) / mTotalPower;
if (vehicleData.getRemainingBattery() < criticalMark) {
vehicleData.setBatteryCritical(Boolean.TRUE);
System.out.println(powerWarning);
} else {
vehicleData.setBatteryCritical(Boolean.FALSE);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请让我知道如何解决此问题。
谢谢
您需要将属性注入到 spring 管理的 bean 中。您可以做的是将属性捆绑在这样的 bean 中(请参阅文档)
@ConfigurationProperties(prefix="vehicle")
public class VehicleProperties {
@Value("${battery.critical.limit}")
private double mCriticalLimit;
@Value("${battery.default}")
private double mTotalPower;
@Value("${battery.critical.warning}")
private String powerWarning;
}
Run Code Online (Sandbox Code Playgroud)
然后,将车辆属性注入到您的服务中并将它们传递给 VehicleUtil:
public class WalkServiceImpl {
@Autowired
private VehicleProperties vehicleProperties;
@Override
public void performTask(VehicleData vehicleData) {
...
VehicleUtil.checkBatteryStatus(vehicleProperties, vehicleData);
}
}
Run Code Online (Sandbox Code Playgroud)
更好的是,我会将 VehicleUtil 转换为托管 bean
@Component
public class VehicleUtil {
@Autowired
private VehicleProperties vehicleProperties;
}
Run Code Online (Sandbox Code Playgroud)
车辆数据
我假设 VehicleData 是一些业务对象,从客户端传递或您自己创建,它们是许多实例(而不仅仅是一个单例)。在这种情况下,将 VehicleData 转换为托管 bean 是没有意义的,它的外部依赖项只能通过其 setter 提供给它:
public class VehicleData {
private double walkingDistance;
private double liftWeight;
private double remainingBattery;
// setters & getters ....
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4458 次 |
| 最近记录: |