在请求正文中使用时配置属性未自动装配?

Configuration properties not autowired when used in request body?

我在我的控制器中使用特定的 class (ClassA) 作为请求主体,但在那个 class 中,我的自动装配 ConfigurationProperties 为空。

控制器:

@RestController
@RequestMapping(value = "/rest/v1/")
public class XyzController {

    @Autowired
    ServiceXyz serviceXyz;

    @PostMapping(value = "/route")
    public void route(@RequestBody ClassA classA) {
        serviceXyz.methodAbc(classA);
    }
}

服务XYZ:

@Service
public class ServiceXyz {

    public boolean methodAbc(ClassA classA) {
        return classA.methodA() && otherStuff();
    }
}

ClassA.java:

@Component
public class ClassA {

    @Autowired
    ApplicationProperties applicationProperties;

    public boolean methodA() {
        return fieldA.equals(applicationProperties.someProperty());
    }
}

ApplicationProperties.java:

@Component
@ConfigurationProperties(prefix="stuff")
public class ApplicationProperties {
    // etc.
}

ClassA.methodAapplicationPropertiesnull,即使每个人都标有正确的注释,并且自动装配在整个应用程序的其余部分工作。

有没有可能这根本行不通?

自动装配适用于 Spring 上下文中的对象。在你的请求中, ClassA 对象是从 JSON 解析的,我认为不是从 Spring 上下文中获取的。 您最好更改您的代码,使 ClassA 成为简单的 DTO,并将 ApplicationProperties 注入您的服务 class.

你可以把你的ClassA改成这个

public class ClassA {

  public boolean methodA(ApplicationProperties applicationProperties) {
      return fieldA.equals(applicationProperties.someProperty());
  }
}

以及您对此的服务:

@Service
public class ServiceXyz {

  @Autowired
  private ApplicationProperties applicationProperties;

  public boolean methodAbc(ClassA classA) {
    return classA.methodA(applicationProperties) && otherStuff();
  }
}