值未从应用程序注入@ReuqestBody POJO-dev.properties - SpringBoot 应用程序

value not injecting in @ReuqestBody POJO from application-dev.properties - SpringBoot Application

我是 Java SpringBoot 的新手,我正在尝试从 application-dev.properties 文件中注入默认值。 基本上,想法是将默认值设置为 RequestObject 的 ID 属性,默认值从应用程序-dev.properties.

注入(/获取)

用例:在 API 的请求正文中没有数据或空白数据被传递的情况下,代码应设置默认值(来自应用程序的 injected/fetched-dev.properties ).

控制器代码

@RequestMapping(value = PATH, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
private @ResponseBody ResponseEntity<ResponseBean<ResponseObject>> postController(
    final @Valid @RequestBody RequestObject request) throws Exception {
return serviceClass.service(request);
}

我在 RequestObject Class 代码中做了以下操作

public class RequestObject {

    @Value("${package.default}")
    private String default_id;
    private String id = default_id;
    
    public String getId() {
     return id;
}

public void setId(String id) {
    this.id = !StringUtils.isBlank(id) ? id : default_id;
}

以上代码无效。 请帮助或建议更好的方法来实现要求。

注意:如果我在 setter 方法中定义 & 时将 id 值硬编码为 id="abcd",则代码有效。

为什么在请求正文对象中使用 @Value("${package.default}")?它不应该工作,因为它们只映射 json 到 pojo 对象。您可以在服务 class 中使用 @Value("${package.default}") 并启动 default_id。之后你可以将它设置为你的 RequestObject .

您只能在 spring 托管组件中注入内容(来自应用程序属性的默认值、其他 bean 等)- 这些组件 class 用 @Component@Service

RequestObject,作为一个 class 你将请求主体映射到, 不是 ,并且 不应该 成为一个组成部分。

为了从 application.properties 注入默认值,您需要自定义解串器,它是一个 bean,并使用 ObjectMapper.

注册这个解串器
@Component
public class RequestObjectDeserializer extends StdDeserializer<RequestObject> {

    @Value("${your.property.here}")
    private String defaultValue;

    public RequestObjectDeserializer() {
        super(RequestObject.class);
    }

    @Override
    public RequestObject deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
        //deserialize
    }
}

然后注册到已经存在的 Objectmapper:

@Autowired
public void configObjectMapper(ObjectMapper objectMapper, RequestObjectDeserializer deserializer) {
    SimpleModule module = new SimpleModule();
    module.addDeserializer(RequestObject.class, deserializer);
    objectMapper.registerModule(module);
}

您可以在任何 @Configuration class.

中添加以上内容

我想说在 RequestObject 中将默认值保留为静态字段并在 setter 中保留逻辑在这种情况下更好。