我创建了 MCVE以下。该服务应该收到一条消息,并将元音替换为来自 application.properties
的预定义 ugly.char
。
应用程序.properties:
ugly.char=x
UglifyService.java:
public interface UglifyService {
String uglifyMessage(String message);
}
UglifyServiceImpl.java:
@Service
public class UglifyServiceImpl implements UglifyService {
@Value("${ugly.char}")
private char uglyCharFromAppProp;
private final char uglyChar;
@Autowired
public UglifyServiceImpl() {
this.uglyChar = uglyCharFromAppProp;
}
@Override
public String uglifyMessage(String message) {
return message.replaceAll("[aeiouAEIOU]", String.valueOf(uglyChar));
}
}
UglyCharController.java:
@Controller
public class UglyCharController {
private final UglifyService uglifyService;
@Autowired
public UglyCharController(UglifyService uglifyService) {
this.uglifyService = uglifyService;
}
@Value("${ugly.char}")
private char uglyChar;
@RequestMapping("/")
@ResponseBody
public String index() {
return "Usage: http://localhost:8080/some-message";
}
@GetMapping("/{message:.+}")
@ResponseBody
public String uglifyMessage(@PathVariable String message) {
String uglyMessage = uglifyService.uglifyMessage(message);
return "The ugly char is: '"+ uglyChar +"'." +
"<br>The uglifyed message is: "+ uglyMessage;
}
}
应用程序.java:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
问题是,服务没有替换元音,而是只是删除了它们。
当请求 localhost:8080/mymessage
时,响应应该是 mymxssxgx
,但我得到的是 mymssg
。
我的问题是:
- 为什么服务没有按预期运行?
- 考虑到我希望
uglyChar
在单例服务中成为 final 并且来自application.properties
,什么是让它工作的正确方法?
注意:如果我将 String.valueOf(uglyChar)
替换为 String.valueOf(uglyCharFromAppProp)
,该服务将开始工作,但是 uglyChar
不会像我希望的那样是最终的。
最佳答案
当对象被实例化时,首先执行构造函数,然后设置属性值并执行@Value
。因此,uglyChar 的值不具有该属性的值。
你可以这样做:
private final char uglyChar;
@Autowired
public UglifyServiceImpl(@Value("${ugly.char}") final char uglyCharFromAppProp){
this.uglyChar = uglyCharFromAppProp;
}
关于java - Spring:在实例化最终字段的 Autowiring 构造函数中使用应用程序属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44468862/