相关疑难解决方法(0)

从弹簧控制器下载文件

我有一个要求,我需要从网站上下载PDF.PDF需要在代码中生成,我认为这将是freemarker和像iText这样的PDF生成框架的组合.有更好的方法吗?

但是,我的主要问题是如何允许用户通过Spring Controller下载文件?

java spring controller file download

354
推荐指数
9
解决办法
41万
查看次数

Class.getResource()和ClassLoader.getResource()有什么区别?

我想知道Class.getResource()和之间的区别是什么ClassLoader.getResource()

编辑:我特别想知道文件/目录级别是否涉及任何缓存.如"在类版本中缓存的目录列表?"

以下AFAIK应该基本上做同样的事情,但它们不是:

getClass().getResource() 
getClass().getClassLoader().getResource()
Run Code Online (Sandbox Code Playgroud)

我在摆弄一些报告生成代码时发现了这一点,该代码WEB-INF/classes/从该目录中的现有文件创建了一个新文件.当使用Class中的方法时,我可以找到部署时使用的文件getClass().getResource(),但在尝试获取新创建的文件时,我收到了一个null对象.浏览目录会清楚地显示新文件存在.文件名前面带有正斜杠,如"/myFile.txt"中所示.

另一方面,ClassLoader版本getResource()确实找到了生成的文件.根据这种经验,似乎存在某种目录列表的缓存.我是对的,如果是的话,这会记录在哪里?

API文档Class.getResource()

查找具有给定名称的资源.搜索与给定类关联的资源的规则由类的定义类加载器实现.此方法委托给此对象的类加载器.如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResource(java.lang.String).

对我来说,这是"Class.getResource真正调用它自己的类加载器的getResource()".这和做的一样getClass().getClassLoader().getResource().但显然不是.有人可以请我为此事提供一些启示吗?

java classloader getresource

186
推荐指数
5
解决办法
14万
查看次数

运行jar时找不到类路径资源

在Spring Boot 1.1.5和1.1.6中都有这个问题 - 我正在使用@Value注释加载一个类路径资源,当我在STS(3.6.0,Windows)中运行应用程序时,它可以正常工作.但是,当我运行mvn包然后尝试运行jar时,我得到FileNotFound异常.

资源message.txt位于src/main/resources中.我检查了jar并验证它在顶层包含文件"message.txt"(与application.properties相同的级别).

这是应用程序:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements CommandLineRunner {

    private static final Logger logger = Logger.getLogger(Application.class);

    @Value("${message.file}")
    private Resource messageResource;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... arg0) throws Exception {
        // both of these work when running as Spring boot app from STS, but
        // fail after mvn package, and then running as java -jar
        testResource(new ClassPathResource("message.txt"));
        testResource(this.messageResource);
    }

    private void testResource(Resource resource) {
        try { …
Run Code Online (Sandbox Code Playgroud)

java spring-boot

106
推荐指数
5
解决办法
11万
查看次数

40
推荐指数
3
解决办法
6万
查看次数

Class.getResource()和ClassLoader.getResource()在可执行jar中的奇怪行为

我理解Class.getResource()和ClassLoader.getResource()之间有什么区别? 从自己的代码,那

getClass().getResource("/path/image.png")
Run Code Online (Sandbox Code Playgroud)

是完全相同的

getClass().getClassLoader().getResource("path/image.png")
Run Code Online (Sandbox Code Playgroud)

发布无法读取jar文件中的图像显示使用的问题

getClass().getClassLoader().getResource("path/image.png")
Run Code Online (Sandbox Code Playgroud)

在可执行jar文件中返回null,而

getClass().getResource("/path/image.png")
Run Code Online (Sandbox Code Playgroud)

返回正确的URL.

Since Class.getResource()代表ClassLoader.getResource()在删除前导斜杠后,我希望这些调用是相同的,但显然它们不是这种情况.即使特殊类加载器附加到特定类,每次调用它仍然应该是相同的,再次导致相同的行为.

所以,问题是:是否存在以下代码在第一次调用时返回null但第二次调用的正确URL的任何明显情况?

package com.example;

import java.net.URL;

public class ResourceTest {

   public void run() {
      URL iconUrl1 = getClass().getClassLoader().getResource("path/image.png");
      System.out.println("ClassLoader.getResource(\"path/image.png\"): " + iconUrl1);

      URL iconUrl2 = getClass().getResource("/path/image.png");
      System.out.println("Class.getResource(\"/path/image.png\"): " + iconUrl2);
   }

   public static void main(String[] args) {
      ResourceTest app = new ResourceTest();
      app.run();
   }
}
Run Code Online (Sandbox Code Playgroud)

java executable-jar classloader embedded-resource

34
推荐指数
1
解决办法
5万
查看次数

IntelliJ IDEA - getClass().getResource("...")返回null

我正在使用IntelliJ IDEA 13.1.5,我曾经使用Eclipse.我正在研究JavaFX应用程序,我尝试使用getClass().getResource()在我的MainApp类中加载FXML文件.我阅读了文档并尝试了几个想法,最后我得到了null.

这是层次结构:

dz.bilaldjago.homekode.MainApp.java

dz.bilaldjago.homekode.view.RootLayout.FXML

这是我使用的代码片段:

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/RootLayout.fxml"));
Run Code Online (Sandbox Code Playgroud)

我尝试了其他解决方案,例如从root用户提供url并使用classLoader

结果是一样的.请问任何想法

java javafx intellij-idea fxml

22
推荐指数
3
解决办法
2万
查看次数

使用getClass()加载资源.getResource()

我正在尝试加载图像以用作我的应用程序中的图标.根据本教程的适当方法是:

protected ImageIcon createImageIcon(String path, String description) 
{
    java.net.URL imgURL = getClass().getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL, description);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我放置了文件的位置,并将其作为参数传递给此函数.这不起作用,即imgURL为null.当我尝试通过显式传递路径来创建ImageIcon时:

ImageIcon icon  = new ImageIcon(path,"My Icon Image");
Run Code Online (Sandbox Code Playgroud)

它工作得很好!因此,应用程序可以从显式定义的路径中获取图像,但是没有使用getResources()来获取图像.在这两种情况下,path变量的值都是相同的.为什么它不起作用?如何通过类加载器找到资源?

谢谢.

java swing

21
推荐指数
3
解决办法
12万
查看次数

在 spring-boot 中从 jar 中读取文件

我正在使用 Spring boot 2.0.4,尝试读取放置在 resources/ 目录中的 json 文件,但收到“FileNotFoundException”。

我已经从 Stackoverflow 和其他链接引用了很多页面,但到目前为止还没有成功。

以下是堆栈跟踪片段,我不确定为什么会有“!” 在类路径中:

/opt/springboot/myProject.jar!/BOOT-INF/classes!/schema/jsonValidationSchema.json at o.s.u.ResourceUtils.getFile(ResourceUtils.java:217) at o.s.u.ResourceUtils.getFile(ResourceUtils.java:180)
Run Code Online (Sandbox Code Playgroud)

这是代码片段:

        InputStream in = new ClassPathResource("jsonValidationSchema.json").getInputStream();
        JsonNode schemaJsonNode = JsonLoader.fromReader(new InputStreamReader(in, "UTF-8"));
        JsonSchema schemaNode = ValidationUtils.getSchemaNode(schemaJsonNode);
Run Code Online (Sandbox Code Playgroud)

参考:

jar 内的文件对于 spring 不可见

从 Spring Boot 中的资源文件夹中读取文件

https://smarterco.de/java-load-file-from-classpath-in-spring-boot/

java.io.FileNotFoundException:无法打开类路径资源,因为它不存在

java.io.FileNotFoundException:类路径资源

spring java-io spring-boot

7
推荐指数
0
解决办法
1万
查看次数

如何在 Java 9 中使用类加载器访问资源

我在 Eclipse 中有一个 gradle 项目。这是我的项目的结构

项目结构

我在 .cssstyleclass.css中有 css 资源scr/main/resources/css。首先我尝试使用访问它

scene.getStylesheets().add("css/styleclass.css"); 
Run Code Online (Sandbox Code Playgroud)

但是我收到警告resource not found.我也通过删除module-info.java文件来尝试它。但结果是一样的。

然后我尝试使用

String urlString = ComboBoxStyling.class.getClassLoader().getResource("css/styleclass.css").toExternalForm();
Run Code Online (Sandbox Code Playgroud)

问题是,如果我删除moduele-info.java并应用样式表,这条线会起作用。但是随着module-info.java我收到空指针异常。

我知道的不多,但至少我知道类加载器在 Java 9 中有变化。那么我如何在 Java 9 中做同样的事情。我的module-info.java文件包含以下内容

module pk.training.basit {
    exports pk.training.basit;
    requires transitive javafx.controls;
}
Run Code Online (Sandbox Code Playgroud)

感谢和问候

巴斯特·马哈茂德·艾哈迈德

java javafx classloader java-9

5
推荐指数
1
解决办法
1766
查看次数

Spring boot打包后找不到资源文件

我使用 Spring boot maven 插件将应用程序打包为 jar 文件。

直接在Itellij IDE中运行可以找到资源文件,但是之后找不到资源文件,显示错误为:

java.io.FileNotFoundException:类路径资源 [jmxremote.password] 无法解析为绝对文件路径,因为它不驻留在文件系统中:jar:file:/home/XXX/target/YYY.jar!/BOOT-INF /classes!/jmxremote.password

但是,jar 文件中确实存在文件“jmxremote.password”。

    private Properties initialJMXServerProperties() throws RuntimeException {
    URL passwordURL = JMXConfig.class.getClassLoader().getResource(passwordFileName);
    URL accessURL   = JMXConfig.class.getClassLoader().getResource(accessFileName);

    String passFile     = Optional.ofNullable(passwordURL).map(URL::getPath).orElseThrow(() -> new RuntimeException("JMX password file not exist"));
    String accessFile   = Optional.ofNullable(accessURL).map(URL::getPath).orElseThrow(() -> new RuntimeException("JMX access file not exist"));

    Properties properties = new Properties();
    properties.setProperty(PASSWORD_FILE_PROP, passFile);
    properties.setProperty(ACCESS_FILE_PROP, accessFile);
    return properties;
}
Run Code Online (Sandbox Code Playgroud)

resources spring

3
推荐指数
1
解决办法
6407
查看次数