如何在使用Spring创建对象之前检查约束



我编写了自己的单元转换器。我有Measure.class,它有字段BigDecimal valueUnit unit(Unit.class是我自己的抽象类,有很多实现,意思是米、英寸、开尔文等(

@Component
@Getter
@Setter
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class Measure {
BigDecimal value;
Unit unit;
public Measure(BigDecimal value, Unit unit) {
this.value = value;
this.unit = unit;
}
}

此外,我还用check()方法创建了抽象的MeasureConstraint.class及其许多实现(如TemperatureConstraint.class(。创建对象Measure时应该调用check()方法。

我想得到什么,例如:

Measure measure = new Measure (5, *Kelvin*); // OK
Measure measure = new Measure (-5, *Kelvin*); // exception, Kelvin should be 0 or greater

我已经尝试将字段List<MeasureConstraint> constraints插入到Measure.class中(并将此字段添加到@Autowired的构造函数参数中(,通过键入此列表进行筛选以获得所需的约束,并在构造函数中调用它的check()方法。

但是这个解决方案使我无法在应用程序中的其他类中自己(不使用Spring(简单地创建Measure对象,因为现在我也必须自己创建List<MeasureConstraint> constraints(我知道Spring在这种情况下不起作用(。我需要自己创建Measure对象的原因是,我需要在转换过程中创建临时变量。

我刚开始学习Spring,并没有完全理解IoC和DI的概念。如果我使用Spring,也许我永远不应该使用手动对象创建?我是否应该将所有临时变量作为Converter.class的字段注入,并在`convert((方法中使用它们,从而避免手动创建对象?请给我一些建议。

对不起我/谷歌翻译/英语=(

也许您可以创建一个单独的类来负责创建Measure对象。在那里,您可以注入MeasureConstraintbean,并在创建度量之前执行验证数据的逻辑。

类似的东西:

@Component
public class MeasureFactory {
@Autowired // actually it's better to inject via constructor
private List<MeasureConstraint> constraints;

public Measure createMeasure(BigDecimal value, Unit unit) {
// perform validation using constraints
return new Measure(value, unit);
}
}

最新更新