Skip to content
🤔prompts chat🧠
🔍
question:@Slf4j @Component public class JFXPostProcessor implements BeanDefinitionRegistryPostProcessor { @jakarta.annotation.Resource private ResourcePatternResolver resourcePatternResolver; @jakarta.annotation.Resource private JFXConfig jfxConfig; @Override @SneakyThrows public void postProcessBeanDefinitionRegistry(@NonNull BeanDefinitionRegistry registry) throws BeansException { log.info("自动解析装配fxml相关bean定义, 取fxml文件名作为bean name"); for (Resource resource : resourcePatternResolver.getResources(jfxConfig.getFxmlScan())) { GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE); beanDefinition.setBeanClass(Parent.class); beanDefinition.setInstanceSupplier(() -> { try { return FXMLLoader.load(resource.getURL()); } catch (IOException e) { throw new RuntimeException(e); } }); IllegalArgumentException exception = new IllegalArgumentException("无法解析fx:controller属性,请检查" + resource.getURL().getPath() + "文件"); String line = FileUtil.readUtf8Lines(resource.getURL()).stream().filter(fileLine -> fileLine.contains("fx:controller")).findFirst().orElseThrow(() -> exception); Matcher matcher = Pattern.compile("fx:controller="(.*?)"").matcher(line); if (matcher.find()) { String fullClassName = matcher.group(1); String[] fullClassPath = fullClassName.split("."); String beanName = StringUtils.uncapitalize(fullClassPath[fullClassPath.length - 1]); registry.registerBeanDefinition(beanName, beanDefinition); } else { throw exception; } } } } @Data @Configuration public class JFXConfig { @Value("{spring.fx.fxml-scan:/**/*.fxml}") private String fxmlScan; @Value("{spring.fx.css-scan:/**/*.css}") private String cssScan; } 提示jfxConfig为null

answer:如果你遇到在`BeanDefinitionRegistryPostProcessor`实现中`jfxConfig`字段为`null`的问题,原因通常在于Spring容器的生命周期。`BeanDefinitionRegistryPostProcessor`是在容器启动阶段非常早就被调用的,这一阶段Spring容器还没准备好处理基于注解的依赖注入(比如`@Autowired`,`@Resource`等)。因此,你在这一阶段使用注解尝试注入`jfxConfig`配置类的实例时,注入不会成功。 为了在`BeanDefinitionRegistryPostProcessor`中使用外部配置,你可以改用通过编程的方式直接从环境或者属性源中获取所需的配置属性。这可以通过实现`EnvironmentAware`接口来完成,这个接口允许你访问Spring的`Environment`,它是一个保存了所有配置属性的组件。 这里是如何修改你的`JFXPostProcessor`以解决`jfxConfig`为`null`的问题的一个示例: ```java @Slf4j @Component public class JFXPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware { private ResourcePatternResolver resourcePatternResolver; private Environment environment; @Autowired // 使用构造器注入确保resourcePatternResolver不会是null public JFXPostProcessor(ResourcePatternResolver resourcePatternResolver) { this.resourcePatternResolver = resourcePatternResolver; } @Override public void setEnvironment(Environment environment) { this.environment = environment; } @Override @SneakyThrows public void postProcessBeanDefinitionRegistry(@NonNull BeanDefinitionRegistry registry) throws BeansException { log.info("自动解析装配fxml相关bean定义"); // 从Environment获取配置 String fxmlScan = environment.getProperty("spring.fx.fxml-scan", "/**/*.fxml"); for (Resource resource : resourcePatternResolver.getResources(fxmlScan)) { GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE); beanDefinition.setBeanClass(Parent.class); beanDefinition.setInstanceSupplier(() -> { try { return FXMLLoader.load(resource.getURL()); } catch (IOException e) { throw new RuntimeException(e); } }); // 省略解析fx:controller属性的代码 // ... } } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 通常情况下不需要此方法的实现,除非你需要对bean工厂本身进行操作 } } ``` 通过实现`EnvironmentAware`接口,并在`setEnvironment`方法中保存环境(`Environment`)引用,你可以在后面任何时候获取配置属性,即便是在容器的早期启动阶段,这样就解决了因为生命周期问题导致的`jfxConfig`为`null`的问题。 这种方式比利用注入来获取配置更加灵活,也避免了由于生命周期问题导致的注入不成功的问题。

question:Translate to Russian "Those who end up here have their souls stripped from them, leaving them as a conscious shell. They are left to wander an endless desert under a dying purple sun hanging over the horizon in perpetuality."

answer:Те, кто оказывается здесь, лишаются своих душ, оставаясь лишь сознающей оболочкой. Их ждет бесконечное блуждание по безграничной пустыне под угасающим фиолетовым солнцем, вечно висящим над горизонтом.

question:2sg.you-PRS take DEF.INAN gold from DEF.INAN chest

answer:Ты берёшь золото из сундука.

question:2sg.you-PAST take DEF.INAN gold from DEF.INAN chest

answer:Ты взял(а) золото из сундука.

Released under the Ad License.

has loaded