java - Spring:在实例化最终字段的 Autowiring 构造函数中使用应用程序属性

标签 java spring spring-mvc spring-boot dependency-injection

我创建了 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

我的问题是:

  1. 为什么服务没有按预期运行?
  2. 考虑到我希望 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/

相关文章:

java - 如何为android数据网格设置id?

spring - 如何修复tomcat中的这个Spring MVC启动异常?

java - 清洁代码以在 Spring @PatchMapping 中对域类进行部分修补?

json - Log4j2.json 错误无法配置没有名称 : arg[2](null)? 的记录器

spring - Spring JSP MVC 和 Thymeleaf MVC 的区别

java - 外围 Java 线程方法的后台工作对调用线程的影响

java - 如何为 Mac/Windows 捆绑 Java 应用程序?

Java正则表达式匹配url中的模式

spring - 找不到Java 10 Spring Boot Infinispan org.jgroups.logging.Slf4jLogImpl

java - Spring @RequestMapping 日志消息?