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

问题描述 投票:0回答:2

我是 Java SpringBoot 新手,我正在尝试从 application-dev.properties 文件注入默认值。 基本上,这个想法是将默认值设置为 RequestObject 的 id 属性,默认值从 application-dev.properties 注入(/获取)。

UseCase:如果 API 的请求正文中没有传递任何数据或空白数据,代码应设置一个默认值(从 application-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 类代码中执行了以下操作

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" 进行硬编码),则代码可以正常工作。

java spring spring-boot spring-mvc application.properties
2个回答
1
投票

您只能在 Spring 托管组件中注入东西(来自应用程序属性、其他 bean 等的默认值) - 这些是用

@Component
@Service
等注释的类。

RequestObject
,是您将请求正文映射到的类,不是,并且不应该是组件。

为了从 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
课程中添加以上内容。

我想说,在这种情况下,将默认值保留为

RequestObject
中的静态字段,并将逻辑放在 setter 中会更好。


0
投票

为什么在请求主体对象中使用

@Value("${package.default}")
?它不应该工作,因为他们只将 json 映射到 pojo 对象。 您可以在服务类中使用
@Value("${package.default}")
来使用和启动default_id。之后您就可以将其设置为您的
RequestObject
.

© www.soinside.com 2019 - 2024. All rights reserved.