Spring Boot não exibe conteúdo estático

173

Não consigo que meu projeto de inicialização Spring sirva conteúdo estático.

Coloquei uma pasta chamada staticsob src/main/resources. Dentro dela, tenho uma pasta chamada images. Quando empacoto o aplicativo e o executo, ele não consegue encontrar as imagens que coloquei nessa pasta.

Eu tentei colocar os arquivos estáticos em public, resourcese META-INF/resources, mas nada funciona.

Se eu jar -tvf app.jar, posso ver que os arquivos estão dentro do jar na pasta correta: /static/images/head.pngpor exemplo, mas chamando :, http://localhost:8080/images/head.pngtudo o que recebo é um404

Alguma idéia de por que o boot-spring não está encontrando isso? (Estou usando 1.1.4 BTW)

Vinicius Carvalho
fonte
6
A manipulação de recursos padrão é mapeada para / **. Verifiquei se está ativado. Se estiver, você verá uma linha que termina com "Caminho da URL mapeada [/ **] no manipulador do tipo [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]" na saída quando você inicia o aplicativo. Outra possibilidade é um controlador próprio que também é mapeado para / ** e tem precedência sobre o manipulador de recursos. A publicação da saída da inicialização do seu aplicativo facilitaria a visualização do que está acontecendo.
Andy Wilkinson
12
Suponho que você tenha @EnableWebMvc(ou equivalente) em seu aplicativo. Isso desativaria a configuração padrão do Boot MVC.
Dave Syer 11/07
1
Não, não tenho @EnableWebMvc em lugar algum. Eu não entendo isso. Agora está acontecendo com os modelos também. Qualquer um dos meus modelos (freemarker) está sendo encontrado pelo carregador de classes da bota de mola.
Vinicius Carvalho
2
Estou com um problema semelhante e não tive sorte com nenhuma das resoluções recomendadas. Se alguém pudesse ser tão gentil em dar uma olhada e apontar exatamente o que estou fazendo de errado, seria muito apreciado !!! github.com/kylebober/kbss
Kyle S. Bober
3
Descobri que se eu tiver um arquivo src / main / resources / public / style.css, o URL para isso é /style.css e não /public/style.css como eu esperava.
Dave

Respostas:

179

Não para ressuscitar os mortos depois de mais de um ano, mas todas as respostas anteriores perdem alguns pontos cruciais:

  1. @EnableWebMvcna sua turma será desativado org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration. Tudo bem se você deseja controle completo, mas, caso contrário, é um problema.
  2. Não é necessário escrever nenhum código para adicionar outro local para recursos estáticos, além do que já é fornecido. Observando a org.springframework.boot.autoconfigure.web.ResourcePropertiespartir da v1.3.0.RELEASE, vejo um campo staticLocationsque pode ser configurado no application.properties. Aqui está um trecho da fonte:

    /**
     * Locations of static resources. Defaults to classpath:[/META-INF/resources/,
     * /resources/, /static/, /public/] plus context:/ (the root of the servlet context).
     */
    private String[] staticLocations = RESOURCE_LOCATIONS;
    
  3. Como mencionado anteriormente, o URL da solicitação será resolvido em relação a esses locais. Assim src/main/resources/static/index.html, será veiculado quando o URL da solicitação for /index.html. A classe responsável pela resolução do caminho, a partir da Primavera 4.1, é org.springframework.web.servlet.resource.PathResourceResolver.

  4. A correspondência de padrão de sufixo é ativada por padrão, o que significa que para uma URL de solicitação /index.html, o Spring procurará manipuladores correspondentes /index.html. Esse é um problema se a intenção é veicular conteúdo estático. Para desabilitar isso, estenda WebMvcConfigurerAdapter(mas não use @EnableWebMvc) e substitua configurePathMatchcomo mostrado abaixo:

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        super.configurePathMatch(configurer);
    
        configurer.setUseSuffixPatternMatch(false);
    }
    

IMHO, a única maneira de ter menos erros no seu código é não escrever código sempre que possível. Use o que já é fornecido, mesmo que isso exija alguma pesquisa, o retorno vale a pena.

Abhijit Sarkar
fonte
3
essa resposta é realmente depois de muita pesquisa. Um ótimo para ler
Ekansh Rastogi
2
Se eu foi fundamental Gostaria de ter esta resposta e colocá-lo na Primavera Bota documentação
aliopi
2
@Abhijit Sarkar, eu quis dizer a empresa Pivotal , desculpe-me por quaisquer sentimentos ruins, mas não foi intencional. Pivotal é o proprietário da Spring, se eu estiver correto. Eu poderia documentá-lo, mas eles têm pessoas que são pagas para isso, então eles devem fazê-lo: P
aliopi
1
@aliopi Spring é um projeto de código aberto.
Abhijit Sarkar
3
a única maneira de ter menos erros no seu código não é escrever um código [...] realmente assim.
Clijsters
78

Diferentemente do que afirma o spring-boot, para obter meu jar de spring-boot para servir o conteúdo: eu tive que adicionar especificamente registrar meu src / main / resources / static content através desta classe de configuração:

@Configuration
public class StaticResourceConfiguration implements WebMvcConfigurer {

    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
            "classpath:/META-INF/resources/", "classpath:/resources/",
            "classpath:/static/", "classpath:/public/" };

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
            .addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
    }
}
François
fonte
3
Eu tenho o mesmo problema, mesma versão da Primavera de inicialização, mas isso não funcionou para mim também
Greyfox
Corrigido o meu problema na versão 1.2.5 !! muito obrigado .. vote nisso !!
Mrclrchtr
Este hack funciona ... estranho que a configuração automática falhar
Allan Vital
Lamentavelmente, esse truque não funciona para mim, o que é uma pena devido à elegância. Não tenho certeza se a causa raiz são os caminhos para o recurso. Talvez, como eu o execute no Windows, eles precisem ser formatados de maneira diferente?
Acarlstein 18/04/19
50

Eu tive um problema semelhante, e a solução simples era ter minha classe de configuração estendida WebMvcAutoConfiguration:

@Configuration
@EnableWebMvc
@ComponentScan
public class ServerConfiguration extends WebMvcAutoConfiguration{
}

Eu não precisava de nenhum outro código para permitir que meu conteúdo estático fosse veiculado; no entanto, coloquei um diretório chamado publicunder src/main/webappe configurei o maven para apontar src/main/webappcomo um diretório de recursos. Isso significa que ele publicé copiado target/classese, portanto, está no caminho de classe no tempo de execução para o spring-boot / tomcat encontrar.

Engenheiro de software
fonte
Dessa maneira, os recursos estáticos não funcionam em outros perfis. por exemplo, tenho um perfil para lançamento que usa outro endereço IP. Eu recebo o erro 404 para todos os meus recursos.
Mahdi
24

Procure Controladores mapeados para "/" ou sem nenhum caminho mapeado.

Eu tive um problema como esse, obtendo 405 erros, e bati minha cabeça com força por dias. O problema acabou sendo um @RestControllercontrolador anotado que eu esqueci de anotar com uma @RequestMappinganotação. Eu acho que esse caminho mapeado assumiu o padrão "/" e bloqueou o mapeamento estático de recursos de conteúdo.

Johannes
fonte
1
Resolvi isso para mim! Eu tinha um controlador anotado com @RestController ("/ blubb") que está obviamente errado, mas às vezes você não vê a madeira das árvores. Mudá-lo para @RestController @RequestMapping ( "/ blubb") resolveu
krinklesaurus
Estou feliz que ajudou, e divertindo-se com a noção de que a expressão "não pode ver a floresta para todas as árvores" existe em alemão, bem como sueco :)
Johannes
2
Você também pode adicionar explicitamente @RequestMapping ("/") se a intenção é servir conteúdo estático e ter um manipulador dinâmico para solicitações de raiz.
Mjj1409 17/02
1
Uau .... Passei 2 dias perdidos em um presente. Meu aplicativo mvc de inicialização por primavera usa segurança de primavera e não estava vendo o arquivo styles.css. Acredito que a segurança não estava permitindo que o .jsp acesse o arquivo styles.css. Eu tinha um @RequestMapping ({"", "/", "/ home"}) no meu controlador. Tirei o "" e "/" e meu MVC começou a funcionar perfeitamente ... Muito Estranho.
skmansfield
3
@ Shafiul Não A adição de EnableAutoConfiguration e SpringBootApplication é redundante! "@SpringBootApplication" contém o "@EnableAutoConfiguration"
Dehan de Croos
19

A configuração pode ser feita da seguinte maneira:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcAutoConfigurationAdapter {

// specific project configuration

}

Importante aqui é que você WebMvcConfig pode substituir o addResourceHandlersmétodo e, portanto, é necessário invocar explicitamente super.addResourceHandlers(registry)(é verdade que, se você estiver satisfeito com os locais de recursos padrão, não precisará substituir nenhum método).

Outra coisa que precisa ser comentado aqui é que esses locais de recursos padrão ( /static, /public, /resourcese /META-INF/resources) serão registradas somente se não houver já um manipulador de recursos mapeados para /**.

A partir deste momento, se você tiver uma imagem src/main/resources/static/imagesnomeada, image.jpgpor exemplo, poderá acessá-la usando o seguinte URL: http://localhost:8080/images/image.jpg(sendo o servidor iniciado na porta 8080 e o aplicativo implantado no contexto raiz).

Francisco Spaeth
fonte
Talvez seja importante comentar que, embora você possa / substitua o addResourceHandlers, na verdade não é necessário para resolver o problema do OP.
Engenheiro de software
@EngineerDollery obrigado pelo comentário, que era a minha intenção, mas eu adicionei explicitamente a explicação
Francisco Spaeth
Movi meu css / js para a pasta src / main / resources / static e os erros não estão mais lá, mas ainda não consigo fazer com que o css seja exibido na minha página.
Hatem Jaber
Cara, eu viajei pelas profundezas da internet para encontrar essa solução de trabalho. Parece que a chave foi a combinação de @EnableWebMvce WebMvcAutoConfigurationAdapter. Muito obrigado!
22716 Ian Newland
Também não funcionou da caixa para mim. Eu tive que adicionar isso também. Acabei de adicionar meu comentário aqui porque tive dois problemas. Eu também tinha um controlador que mapeou "/" como o @Johannes menciona. Fazer isso e remover meu controlador "/" resolveu meus problemas.
loyalBrown
11

Você verificou os documentos de referência do Spring Boot ?

Por padrão, o Spring Boot servirá conteúdo estático de uma pasta chamada /static(ou /publicou /resourcesou /META-INF/resources) no caminho de classe ou na raiz do ServletContext.

Você também pode comparar seu projeto com o guia Serving Web Content with Spring MVC ou verificar o código-fonte do projeto spring-boot-sample-web-ui .

Matsev
fonte
2
Sim, tentei, esses são os lugares que tentei, conforme as instruções dos documentos. Mas nada funciona. Não entendo por que o recurso não foi encontrado. Eu tentei olhar para as amostras, estranhamente, não existe uma amostra que use a estrutura proposta pelos documentos. O que você acabou de colar usa uma pasta de modelos, presumo que seja para uma configuração ou velocidade do thymeleaf.
Vinicius Carvalho
O exemplo da interface da Web ( github.com/spring-projects/spring-boot/tree/v1.1.3.RELEASE/… ) exibe conteúdo estático.
Andy Wilkinson
Eu concordo com @ViniciusCarvalho, eu tentei todas as combinações possíveis para colocar o css / js no lugar certo e não consigo fazer isso. Mesmo se eu visitar localhost: 8089 / css / styles.css, não vejo nada. Eu só tenho uma regra para mudar a cor do corpo.
Hatem Jaber
10

Eu estava tendo esse problema exato e percebi que havia definido em meu application.properties:

spring.resources.static-locations=file:/var/www/static

O que estava substituindo tudo o que eu havia tentado. No meu caso, eu queria manter os dois, então apenas mantive a propriedade e adicionei:

spring.resources.static-locations=file:/var/www/static,classpath:static

Que serviu os arquivos de src / main / resources / static como localhost: {port} /file.html.

Nenhuma das opções acima funcionou para mim porque ninguém mencionou essa pequena propriedade que poderia ser facilmente copiada da online para servir a um propósito diferente;)

Espero que ajude! Imaginei que caberia bem neste longo post de respostas para pessoas com esse problema.

S. Jacob Powell
fonte
Estou usando o Spring Boot 2.0.5.RELEASE e colocando spring.resources.static-locations=file:/var/www/static,classpath:staticno meu application.properties, mas não funcionou para mim. Estou usando @EnableWebMvcna minha classe de configuração.
Ngo
Foi esse que resolveu meu problema. junto com security.ignoredesecurity.publicPaths
JoSSte
5

Eu acho que as respostas anteriores abordam o tópico muito bem. No entanto, eu acrescentaria que, em um caso, quando você tiver o Spring Security ativado no seu aplicativo, poderá ser necessário informar especificamente o Spring para permitir solicitações para outros diretórios de recursos estáticos, como por exemplo "/ static / fonts" .

No meu caso, eu tinha "/ static / css", "/ static / js", "/ static / images" permitido por padrão, mas / static / fonts / ** foi bloqueado pela minha implementação do Spring Security.

Abaixo está um exemplo de como eu consertei isso.

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.....
    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/", "/fonts/**").permitAll().
        //other security configuration rules
    }
.....
}
RemusS
fonte
5

Apenas para adicionar mais uma resposta a uma pergunta antiga ... As pessoas mencionaram o @EnableWebMvcimpedimento WebMvcAutoConfigurationde carregar, que é o código responsável pela criação dos manipuladores de recursos estáticos. Existem outras condições que impedirão o WebMvcAutoConfigurationcarregamento também. A maneira mais clara de ver isso é olhar para a fonte:

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/ WebMvcAutoConfiguration.java # L139-L141

No meu caso, eu estava incluindo uma biblioteca que tinha uma classe que estava se estendendo, da WebMvcConfigurationSupportqual é uma condição que impedirá a configuração automática:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

É importante nunca se estender WebMvcConfigurationSupport. Em vez disso, estenda de WebMvcConfigurerAdapter.

ATUALIZAÇÃO: A maneira correta de fazer isso no 5.x é implementar o WebMvcConfigurer

Bal
fonte
O WebMvcConfigurerAdapter foi descontinuado a partir do Spring Boot 5.0. Ao pesquisar no Google, isso ocorre nos Javadocs para essa classe: "a partir do 5.0 WebMvcConfigurer possui métodos padrão (possibilitados por uma linha de base do Java 8) e pode ser implementada diretamente sem a necessidade desse adaptador". Então, acho que implementamos o WebMvcConfigurer agora.
Marvo
@ Marvo está exatamente correto. A maneira correta de fazer isso no 5.x é implementando WebMvcConfigurer.
Bal
4

Esta solução funciona para mim:

Primeiro, coloque uma pasta de recursos em webapp / WEB-INF, como segue a estrutura

-- src
  -- main
    -- webapp
      -- WEB-INF
        -- resources
          -- css
          -- image
          -- js
          -- ...

Segundo, no arquivo de configuração da primavera

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter{

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".html");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resource/**").addResourceLocations("WEB-INF/resources/");
    }
}

Em seguida, você pode acessar o conteúdo do recurso, como http: // localhost: 8080 / resource / image / yourimage.jpg

leng
fonte
3

Há duas coisas a considerar (Spring Boot v1.5.2.RELEASE) - 1) Verifique todas as classes Controller quanto à anotação @EnableWebMvc, remova-a se houver 2) Verifique as classes Controller para as quais a anotação é usada - @RestController ou @Controller . Não misture o comportamento da API Rest e MVC em uma classe. Para MVC, use @Controller e, para API REST, use @RestController

Fazer acima de duas coisas resolveu meu problema. Agora minha bota primavera está carregando recursos estáticos sem problemas. @Controller => load index.html => carrega arquivos estáticos.

@Controller
public class WelcomeController {

    // inject via application.properties
    @Value("${welcome.message:Hello}")
    private String message = "Hello World";

    @RequestMapping("/")
    public String home(Map<String, Object> model) {
        model.put("message", this.message);
        return "index";
    }

}

index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>index</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


    <link rel="stylesheet/less" th:href="@{/webapp/assets/theme.siberia.less}"/>

    <!-- The app's logic -->
    <script type="text/javascript" data-main="/webapp/app" th:src="@{/webapp/libs/require.js}"></script>
    <script type="text/javascript">
        require.config({
            paths: { text:"/webapp/libs/text" }
        });
    </script>



   <!-- Development only -->
     <script type="text/javascript" th:src="@{/webapp/libs/less.min.js}"></script>


</head>
<body>

</body>
</html>
gjp
fonte
A remoção do @EnableWebMvc fez isso por mim! Obrigado
turboemu
3

Coloque os recursos estáticos no diretório:

/src/main/resources/static

inclua esta propriedade no arquivo application.properties

server.servlet.context-path=/pdx

Você pode acessar a partir de http: // localhost: 8080 / pdx / images / image.jpg

insira a descrição da imagem aqui

dasunse
fonte
1
Não sei como agradecer . Irmão você é ótimo. Eu tentei quase todas as soluções acima, mas esta é a melhor e a mais curta.
user12061795
2

Caso o problema ocorra ao iniciar o aplicativo a partir de um IDE (por exemplo, iniciando no Eclipse ou no IntelliJ Idea) e usando o Maven, a chave da solução está na documentação de Inicialização do Spring-boot :

Se você estiver usando o Maven, execute:

mvn package && java -jar target/gs-spring-boot-0.1.0.jar

A parte importante disso é adicionar o packageobjetivo a ser executado antes que o aplicativo seja realmente iniciado. (Idea: Runmenu Edit Configrations..., Adde há escolha Run Maven Goal, e especifique o packageobjetivo no campo)

ppeterka
fonte
1

Estou usando o 1.3.5 e hospedo vários serviços REST por meio da implementação de Jersey. Isso funcionou bem até que eu decidi adicionar alguns arquivos HTMLs + js. Nenhuma das respostas dadas neste fórum me ajudou. No entanto, quando adicionei a seguinte dependência no meu pom.xml, todo o conteúdo em src / main / resources / static finalmente foi exibido via navegador:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<dependency>

Parece que spring-web / spring-webmvc é a importante dependência transitiva que ativa a configuração automática da inicialização por primavera.

LilleElefant
fonte
1

FYI: Eu também notei que posso atrapalhar um aplicativo de inicialização de primavera que funciona perfeitamente e impedir que ele sirva conteúdo da pasta estática, se eu adicionar um controlador de descanso incorreto como esse

 @RestController
public class BadController {
    @RequestMapping(method= RequestMethod.POST)
    public String someMethod(@RequestParam(value="date", required=false)String dateString, Model model){
        return "foo";
    }
}

Neste exemplo, depois de adicionar o controlador incorreto ao projeto, quando o navegador solicita um arquivo disponível na pasta estática, a resposta do erro é ' 405 Método Não Permitido '.

Os caminhos de aviso não são mapeados no exemplo de controlador incorreto.

Ganesh
fonte
1

Eu estava enfrentando o mesmo problema no boot da primavera 2.1.3 dizendo que o recurso não foi encontrado 404. Eu removi abaixo do applicatiion.properties .

#spring.resources.add-mappings=true
#spring.resources.static-locations=classpath:static
#spring.mvc.static-path-pattern=/**,

Removeu @enableWebMVC e removeu qualquer substituição do WebMvcConfigurer

// @ EnableWebMvc

Verifique também se você tem @EnableAutoConfiguration em sua configuração.

E coloque todos os recursos estáticos em src / main / resources / static e funcionou como mágica finalmente.

Debadatta
fonte
minha versão da primavera no 2.2.6 e eu tenho @EnableAutoConfiguration e arquivos em src / main / resources / static, mas ele não funciona e gera 500.
shivani thakur
1

usando o boot de primavera 2. *, eu tenho um controlador que mapeia para rotas GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})e lança meu aplicativo para de servir recursos.

eu sei que não é aconselhável ter essas rotas, mas tudo depende do aplicativo que você está construindo (no meu caso, não tenho escolha a não ser ter essas rotas)

então aqui está o meu truque para garantir que meu aplicativo sirva recursos novamente. Eu simplesmente tenho um controlador que mapeia meus recursos. Como a primavera corresponderá a uma rota direta antes de qualquer variável, decidi adicionar um método de controlador que mapeia /imgaes/{name}e repete o mesmo para outros recursos

@GetMapping(value = "/images/{image}", produces = {MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
    public @ResponseBody
    byte[] getImage(@PathVariable String image) {
        ClassPathResource file = new ClassPathResource("static/images/" + image);
        byte[] bytes;
        try {
            bytes = StreamUtils.copyToByteArray(file.getInputStream());
        } catch (IOException e) {
            throw new ResourceNotFoundException("file not found: " + image);
        }
        return bytes;
    }

e isso resolveu meu problema

Raines
fonte
0

Teve o mesmo problema, usando gradle e eclipse e passou horas tentando descobrir.

Sem necessidade de codificação, o truque é que você deve usar a opção de menu Novo-> Pasta de Origem (NÃO Nova -> Pasta) para criar a pasta estática em src / main / resources. Não sei por que isso funciona, mas fiz o novo -> pasta de origem e nomeei a pasta estática (a caixa de diálogo da pasta de origem fornece um erro para o qual você deve verificar: Atualize os filtros de exclusão em outras pastas de origem para resolver o aninhamento). A minha nova pasta estática adicionei index.html e agora funciona.

Vizcaino
fonte
0

Bem, às vezes vale a pena verificar se você substituiu os mapeamentos globais por algum controlador restante. Erro de exemplo simples (kotlin):

@RestController("/foo")
class TrainingController {

    @PostMapping
    fun bazz(@RequestBody newBody: CommandDto): CommandDto = return commandDto

}

No caso acima, você receberá quando solicitar recursos estáticos:

{
    title: "Method Not Allowed",
    status: 405,
    detail: "Request method 'GET' not supported",
    path: "/index.html"
}

A razão para isso poderia ser que você queria para mapear @PostMappinga /foomas esquecer @RequestMappinganotação no @RestControllernível. Nesse caso, todas as solicitações são mapeadas POSTe você não receberá conteúdo estático nesse caso.

Przemek Nowak
fonte
0

Dados os recursos em src / main / resources / static, se você adicionar esse código, todo o conteúdo estático de src / main / resources / static estará disponível em "/":

@Configuration
public class StaticResourcesConfigurer implements WebMvcConfigurer {
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/static/");
    }
}
mmirwaldt
fonte
0

No meu caso, alguns arquivos estáticos não foram servidos, como fontes .woff e algumas imagens. Mas css e js funcionaram muito bem.

Atualização: Uma solução muito melhor para fazer com que o Spring Boot atenda corretamente as fontes woff é configurar a filtragem de recursos mencionada nesta resposta, por exemplo (observe que você precisa de inclusão e exclusão):

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
            <exclude>static/aui/fonts/**</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
            <include>static/aui/fonts/**</include>
        </includes>
    </resource>
</resources>

----- Solução antiga (funcionando, mas irá corromper algumas fontes) -----

Outra solução foi desativar a correspondência de padrão de sufixo com setUseSuffixPatternMatch(false)

@Configuration
public class StaticResourceConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // disable suffix matching to serve .woff, images, etc.
        configurer.setUseSuffixPatternMatch(false);
    }
}

Créditos: @Abhiji me apontou com 4. na direção certa!

LukeSolar
fonte
0

Solicitações para / ** são avaliadas para locais estáticos configurados em resourceProperties .

adicionar o seguinte em application.properties, pode ser a única coisa que você precisa fazer ...

spring.resources.static-locations=classpath:/myresources/

isso substituirá os locais estáticos padrão, que são:

ResourceProperties.CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
        "classpath:/resources/", "classpath:/static/", "classpath:/public/" };

Você pode não querer fazer isso e verifique se os recursos acabam em uma dessas pastas padrão.

Executando uma solicitação: se eu tivesse o example.html armazenado em /public/example.html, posso acessá-lo assim:

<host>/<context-path?if you have one>/example.html

Se eu quiser outra uri como <host>/<context-path>/magico/*para arquivos no classpath: / magicofiles / * você precisa de um pouco mais de configuração

@Configuration
class MyConfigClass implements WebMvcConfigurer

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/magico/**").addResourceLocations("/magicofiles/");
}
Sven Dhaens
fonte
-1

Como dito acima, o arquivo deve estar em $ClassPath/static/images/name.png(/ static ou / public ou / resources ou / META-INF / resources). Esse $ ClassPath significa main/resourcesou main/javadir.

Se seus arquivos não estiverem em diretórios padrão, você poderá adicionar a seguinte configuração:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/lib/**"); // like this
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        // ... etc.
}
...

}

Mavlarn
fonte