Search code examples
javaspringspring-bootsvgbatik

Unable to make sense of URL for connection reading a svg file


I have a Spring Boot v2.1.2.RELEASE application. I have a file in ../src/main/resources/icons/128/black/ae.png

which I want to read, But I got an error: Unable to make sense of URL for connection

@SpringBootApplication
public class SvgManagerApplication implements CommandLineRunner {

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


    @Override
    public void run(String... args) throws Exception {      

        try {

            String parser = XMLResourceDescriptor.getXMLParserClassName();
            SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
            Document doc = f.createDocument("classpath:icons/128/black/ae.svg");

            System.out.println(doc);

        } catch (IOException ex) {

            System.out.println(ex.getMessage());

        }
    }
}

Solution

  • You are mixing two different framework; classpath: is related to Spring while SAXSVGDocumentFactory seems to be related to batik (https://xmlgraphics.apache.org/batik/javadoc/org/apache/batik/anim/dom/SAXSVGDocumentFactory.html)

    You can do in this way:

    @SpringBootApplication
    public class SvgManagerApplication implements CommandLineRunner {
    
        public static void main(String[] args) {
            SpringApplication.run(SvgManagerApplication.class, args);
        }
    
    
        @Override
        public void run(String... args) throws Exception {      
    
            try {
            Resource svg = new ClassPathResource("icons/128/black/ae.png"); 
                String parser = XMLResourceDescriptor.getXMLParserClassName();
                SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
                Document doc = f.createDocument(SVG_DOCUMENT_URI, svg.getInputStream());
    
                System.out.println(doc);
    
            } catch (IOException ex) {
    
                System.out.println(ex.getMessage());
    
            }
        }
    }
    

    More information about Resource can be found here https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/io/Resource.html, while more information about ClassPathResource can be found here https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/io/ClassPathResource.html