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

时间:2018-08-29 17:09:57

标签: java spring spring-boot inversion-of-control

我在控制器中使用特定的类(ClassA)作为请求正文,但在该类中,我的自动装配ConfigurationProperties为空。

控制器:

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

    @Autowired
    ServiceXyz serviceXyz;

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

ServiceXYZ:

@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.methodA中,applicationPropertiesnull,即使每个人都被标记了正确的注释,并且自动装配在整个应用程序的其余部分都有效。

这可能不起作用吗?

1 个答案:

答案 0 :(得分:1)

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

您可以将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();
  }
}