我在下面创建了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;
   }

07-25 23:53