值未从应用程序注入@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 中保留逻辑在这种情况下更好。
我是 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 中保留逻辑在这种情况下更好。