我在下面创建了MCVE。服务应获得一条消息,并用来自ugly.char
的预定义的application.properties
替换元音。
application.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;
}
}
Application.java:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
问题在于,服务只是替换它们而不是替换元音。
请求
localhost:8080/mymessage
时,响应应为mymxssxgx
,但我正在获取mymssg
。我的问题是:
为什么服务无法按预期运行?
考虑到我希望
uglyChar
在单例服务中成为最终结果并来自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;
}