基于requestbody参数在javaspring引导中获取特定的bean

093gszye  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(414)

在我的spring启动应用程序中,我想基于 @RequestBody 收到的值。有没有同样的方法
接口

public interface Vehicle{
  public String drive();
}

接口的实现

@Component
public class Car implements Vehicle {
  public String drive(){
    return "Driving a car";
  }
}

@Component
public class Bike implements Vehicle {
    return "Riding a Bike";
}

现在,在基于请求体的控制器中,我想得到 CAR 或者 Bike .
有没有同样的方法
控制器

@RestController
@RestMapping('type-of-vehicle')
public class VehicleSelectController{
   @PostMapping
   public String identify_Vehicle_Selected(@RequestBody vehicletype vehicletype_data){

     /* ## Code to get the bean of vehicle type sent in the RequestBody */
    // example vehicletype_data selected vehicle is car
    // we get the bean of the 'CAR' class
    // Returns the correct implementation of the type of vehicle selected by user
     return vehicle.drive();

   }
}

有没有什么注解可以用来实现相同的功能?我正在尝试避免创建一个基于接收到的车辆类型返回正确对象的配置类
我在想这个问题
错误的执行方式

@RestController
@RestMapping('type-of-vehicle')
public class VehicleSelectController{
   @PostMapping
   public String identify_Vehicle_Selected(@RequestBody vehicletype vehicletype_data){

     @Autowired
     @Qualifiyer('${vehicletype_data}')
     Vehicle vehicle_object
     return vehicle_object.drive();

   }
}

是否有一种方法可以执行类似于错误实现的操作

7gs2gvoe

7gs2gvoe1#

我发现了类似的问题:通过限定符从applicationcontext获取bean
如果它不能解决您的问题,可以尝试以下方法:
将方法添加到 Vehicle 通过请求中的给定数据检查其是否为目标车辆的接口:

boolean isTargetVehicle(final string valueFromRequest);

汽车实施示例:

public boolean isTargetVehicle(final string valueFromRequest) {
    return "car".equals(valueFromRequest);
}

然后在控制器/服务中注入车辆集合:

@Autowired
Collection<Vehicle> vehicles;

在调用 drive 方法仅适用于目标车辆。它从 drive 方法,否则在未找到车辆支持时引发异常:

vehicles.stream().filter(v -> v.isTargetVehivle(dataFromRequest)).map(Vehicle::drive).findFirst().orElseThrow(() -> new Exception("vehicle not supported"));

在这种方法中,您可以轻松地添加新车辆,而无需修改现有代码。此外,最好使用构造函数注入。

ubby3x7f

ubby3x7f2#

使用spring引导工具可以实现这一点。然而,当我处理同样的问题时,我不喜欢spring开箱即用提供的解决方案的一些细节。所以,我写了我自己的未来,叫做自我填充工厂,完全按照你的要求。此功能作为我的mgntutils开源库的一部分发布。下面是指向javadoc页面的链接,解释了它的工作原理和使用方法:http://michaelgantman.github.io/mgnt/docs/com/mgnt/lifecycle/management/package-summary.html. 这里还有一篇文章解释了这个想法和实现,以及我认为编写这样一个特性是一个好主意的原因:在spring框架中对“孤立”bean的非侵入性访问。该库本身可以在这里作为maven工件获得,并从github下载源代码和javadoc

pu82cl6c

pu82cl6c3#

你可以这样做:

@Component
@Qualifier("Car")
public class Car implements Vehicle {
    @Override
    public String drive() {
        return "Driving a car";
    }
}

@Component
@Qualifier("Bike")
public class Bike implements Vehicle {
    @Override
    public String drive() {
        return "Riding a Bike";
    }
}
public class VehicleSelectController {

    private Map<String, Vehicle> vehicles = new HashMap<>();

    @Autowired
    private void setVehicles(List<Vehicle> vehicles) {
        for (Vehicle vehicle : vehicles) {
            Qualifier qualifier = vehicle.getClass().getAnnotation(Qualifier.class);
            if (qualifier != null)
                this.vehicles.put(qualifier, vehicle);
        }
    }

    @PostMapping
    public String identify_Vehicle_Selected(@RequestBody vehicletype vehicletype_data) {
        Vehicle vehicle = this.vehicles.get(vehicletype_data.getType());
        if (vehicle == null)
            throw new IllegalArgumentException("Unknown type: " + vehicletype_data.getType());
        return vehicle.drive();
    }
}
bvhaajcl

bvhaajcl4#

您可以使用工厂模式。为获取车辆bean创建bean工厂。

@Component
public class VehicleFactory{

    @Autowired
    @Qualifier("bike") // bean name is same as class name with the first letter being lowercase
    private Vehicle bike;

    @Autowired
    @Qualifier("car")
    private Vehicle car;

    public Vehicle getVehicle(VehicleType vehicleType){
        if(vehicleType == VehicleType.CAR){ // Assuming VehicleType is an enum
            return car;    
        } else if (vehicleType == VehicleType.BIKE){
            return bike;
        } else {
            throw new IllegalArgumentException("No bean available for the type " + vehicleType);
        }
    }
}

现在在你的控制器里,

@RestController
@RestMapping('type-of-vehicle')
public class VehicleSelectController{
    @Autowired
    VehicleFactory vehicleFactory;

    @PostMapping
    public String identify_Vehicle_Selected(@RequestBody vehicletype vehicletype_data){
        return vehicleFactory.getVehicle(vehicletype_data).drive(); // handle the exception as needed
    }
}

相关问题