我是 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" 进行硬编码),则代码可以正常工作。
您只能在 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 中会更好。
为什么在请求主体对象中使用
@Value("${package.default}")
?它不应该工作,因为他们只将 json 映射到 pojo 对象。 您可以在服务类中使用 @Value("${package.default}")
来使用和启动default_id。之后您就可以将其设置为您的RequestObject
.