Как добавить папку сборки для реакции & amp; угловой в весеннем ботинке? [Дубликат]

Реляционная алгебра допускает взаимозаменяемость предикатов в предложении WHERE и INNER JOIN , поэтому даже запросы INNER JOIN с В предложениях WHERE предикаты могут быть переупорядочены оптимизатором, так что они могут быть исключены во время процесса JOIN .

Я рекомендую вам писать запросы в наиболее читаемом

Иногда это включает в себя включение INNER JOIN относительно «неполного» и включение некоторых критериев в WHERE просто для составления списков

Например, вместо:

  SELECT * FROM Customers c INNER JOIN CustomerAccounts ca ON ca.CustomerID = c.CustomerID И c.State  = 'NY' INNER JOIN Учетные записи a ON ca.AccountID = a.AccountID AND a.Status = 1  

Запись:

  SELECT * FROM Customers c  INNER JOIN CustomerAccounts ca ON ca.CustomerID = c.CustomerID INNER JOIN Счета a ON ca.Acc  ountID = a.AccountID WHERE c.State = 'NY' AND a.Status = 1  

Но это зависит, конечно.

109
задан Engineer Dollery 28 September 2014 в 21:32
поделиться

16 ответов

Не поднимать мертвых спустя больше года, но все предыдущие ответы пропускают некоторые важные моменты:

  1. @EnableWebMvc на вашем классе отключит org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration. Это нормально, если вы хотите полный контроль, но в остальном это проблема.
  2. Нет необходимости писать код, чтобы добавить другое место для статических ресурсов в дополнение к тому, что уже предусмотрено. Глядя на org.springframework.boot.autoconfigure.web.ResourceProperties из v1.3.0.RELEASE, я вижу поле staticLocations, которое можно настроить в application.properties. Вот фрагмент из источника:
    /**
     * 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. Как упоминалось ранее, URL-адрес запроса будет разрешен относительно этих местоположений. Таким образом, src/main/resources/static/index.html будет использоваться, когда URL-адрес запроса /index.html. Класс, который отвечает за разрешение пути, начиная с Spring 4.1, - org.springframework.web.servlet.resource.PathResourceResolver.
  4. Совпадение шаблонов суффикса включено по умолчанию, что означает URL-адрес запроса /index.html, Spring будет искать обработчиков, соответствующих /index.html. Это проблема, если целью является статический контент. Чтобы отключить это, продолжите WebMvcConfigurerAdapter (но не используйте @EnableWebMvc) и переопределите configurePathMatch, как показано ниже:
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        super.configurePathMatch(configurer);
    
        configurer.setUseSuffixPatternMatch(false);
    }
    

IMHO, единственный способ уменьшить количество ошибок в вашем коде не писать код, когда это возможно. Используйте то, что уже было предоставлено, даже если это потребует некоторых исследований, возвращение того стоит.

114
ответ дан Abhijit Sarkar 16 August 2018 в 00:02
поделиться
  • 1
    И не расширяйте DelegatingWebMvcConfiguration, который имеет тот же эффект, что и при использовании @EnableWebMvc – Aner 3 March 2016 в 22:54
  • 2
    этот ответ действительно после долгих исследований. Отличный, чтобы читать – Ekansh Rastogi 18 June 2016 в 09:36
  • 3
    Если бы я был ключевым, я бы взял этот ответ и поместил его в документацию Spring Boot – aliopi 23 August 2017 в 14:23
  • 4
    @aliopi Spring - проект с открытым исходным кодом. – Abhijit Sarkar 23 August 2017 в 16:58
  • 5
    единственный способ уменьшить количество ошибок в коде - это не писать код [...] , это действительно так. – Clijsters 17 November 2017 в 11:10

Просто добавьте еще один ответ на старый вопрос ... Люди упоминали, что @EnableWebMvc предотвратит загрузку WebMvcAutoConfiguration, что является кодом, ответственным за создание статических обработчиков ресурсов. Существуют и другие условия, которые предотвращают также загрузку WebMvcAutoConfiguration. Самый простой способ увидеть это - посмотреть на источник:

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

В моем случае я включил библиотеку, которая имел класс, который простирался от WebMvcConfigurationSupport, который является условием, которое предотвратит автоконфигурацию:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

Важно, чтобы никогда не простирался от WebMvcConfigurationSupport. Вместо этого простирайтесь от WebMvcConfigurerAdapter.

1
ответ дан Bal 16 August 2018 в 00:02
поделиться

В отличие от состояния весенней загрузки, чтобы получить мой весенний загрузочный ящик для обслуживания содержимого: мне пришлось добавить, что я зарегистрировал свой src / main / resources / static content через этот класс конфигурации:

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {

    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);
    }
}
57
ответ дан Clijsters 16 August 2018 в 00:02
поделиться
  • 1
    У меня такая же проблема, такая же версия Spring Boot, но для меня это не сработало – greyfox 28 July 2015 в 18:09
  • 2
    Исправлена ​​ошибка в версии 1.2.5! большое спасибо .. голос это выше !! – mrclrchtr 13 October 2015 в 22:48
  • 3
    Это 100% работает, пожалуйста, примите этот ответ – Parth Solanki 26 September 2016 в 10:31
  • 4
    Этот хак работает ... странно, что автоматическая конфигурация не работает – Allan Vital 2 December 2017 в 22:50

У меня была аналогичная проблема, и оказалось, что простым решением было расширение моего класса конфигурации WebMvcAutoConfiguration:

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

Мне не нужен какой-либо другой код, чтобы разрешить мой статический контент, который будет обслуживаться, однако, я поместил каталог под public в src/main/webapp и настроил maven, чтобы указать src/main/webapp в качестве каталога ресурсов. Это означает, что public копируется в target/classes и поэтому находится на пути к классам во время выполнения для загрузки spring-boot / tomcat.

43
ответ дан Engineer Dollery 16 August 2018 в 00:02
поделиться
  • 1
    не работал для меня – Djalas 3 March 2017 в 17:52
  • 2
    работал для меня - main/resources/static – edin-m 9 May 2017 в 09:09
  • 3
    Таким образом, статические ресурсы не работают в других профилях. например, у меня есть профиль для выпуска, который использует другой IP-адрес. Я получаю ошибку 404 для всех моих ресурсов. – Kenji 16 July 2017 в 11:41

Конфигурация может быть выполнена следующим образом:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcAutoConfigurationAdapter {

// specific project configuration

}

Важно, что ваш WebMvcConfig может переопределить метод addResourceHandlers, и поэтому вам нужно явно вызвать super.addResourceHandlers(registry) (это правда, что если вас устраивают местоположения ресурсов по умолчанию, вам не нужно переопределять какой-либо метод).

Еще одна вещь, которую нужно прокомментировать здесь, - это то, что те места размещения ресурсов по умолчанию (/static, /public, /resources и /META-INF/resources) будут зарегистрированы, только если ресурс еще не существует обработчик, сопоставленный с /**.

С этого момента, если у вас есть изображение в src/main/resources/static/images с именем image.jpg, например, вы можете получить к нему доступ, используя следующий URL: http://localhost:8080/images/image.jpg (являющийся сервер запущен на порту 8080, а приложение развернуто в корневом контексте).

18
ответ дан Francisco Spaeth 16 August 2018 в 00:02
поделиться
  • 1
    Возможно, важно прокомментировать, что, хотя вы / можете / переопределить addResourceHandlers, вам действительно не нужно, чтобы решить проблему OP. – Engineer Dollery 28 September 2014 в 19:41
  • 2
    @EngineerDollery спасибо за комментарий, это было мое намерение, но я явно добавил объяснение – Francisco Spaeth 28 September 2014 в 20:31
  • 3
    Я переместил свой css / js в папку src / main / resources / static, и ошибок больше нет, но я все еще не могу заставить css отображаться на моей странице. – Hatem Jaber 1 April 2015 в 15:48
  • 4
    Чувак, я путешествовал по глубине Интернета, чтобы найти это рабочее решение. Кажется, ключ был комбинацией @EnableWebMvc и WebMvcAutoConfigurationAdapter. Большое спасибо! – Ian Newland 22 August 2016 в 20:57
  • 5
    Для меня это тоже не сработало. Я должен был добавить это также. Я просто добавляю свой комментарий здесь, потому что у меня было две проблемы. У меня также был контроллер, который отображен "/ & quot; как отмечает @Johannes. Выполнение этого и удаление моей & quot; / & quot; контроллер решил мои проблемы. – loyalBrown 12 April 2017 в 11:36

Есть две вещи, которые следует учитывать (Spring Boot v1.5.2.RELEASE) - 1) Проверьте все классы контроллера для аннотации @EnableWebMvc, удалите его, если есть 2) Проверьте классы контроллера, для которых используется аннотация - @RestController или @Controller. Не смешивайте поведение Rest API и поведение MVC в одном классе. Для MVC используйте @Controller и для REST API используйте @RestController

Выполнение выше 2 вещей разрешило мою проблему. Теперь моя весенняя загрузка загружает статические ресурсы без каких-либо проблем. @Controller => load index.html => загружает статические файлы.

@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>
2
ответ дан gjp 16 August 2018 в 00:02
поделиться
  • 1
    Удаление @EnableWebMvc сделало это для меня! спасибо – turboemu 7 October 2017 в 16:31

По умолчанию Spring Boot обслуживает статические ресурсы, определенные по следующим путям:

  • / META-INF / resources /
  • / resources /
  • / static /
  • / public /

Чтобы изменить пути по умолчанию для статических ресурсов, вы можете определить атрибут "spring.resources.static-locations" в application.properties следующим образом:

spring.resources.static-locations=/html/,/js/,/css/

В вашем случае вы используете пути по умолчанию, прочитанные Spring Boot, вы не должны получать 404 при доступе к / images / , если вы явно не указали другой путь контекста для ваше приложение или вы включили @EnableWebMvc , который переопределяет конфигурацию по умолчанию Spring Boot.

Для получения дополнительной информации об обслуживании и загрузке статических ресурсов в приложении Spring Boot, проверьте следующее: Подавать статические ресурсы с помощью Spring Boot

0
ответ дан Hussein Terek 16 August 2018 в 00:02
поделиться

Я использую 1.3.5 и принимаю кучу REST-сервисов через реализацию Джерси. Это работало нормально, пока я не решил добавить пару файлов HTML + js. Ни один из ответов на этом форуме не помог мне. Однако, когда я добавил следующую зависимость в моем pom.xml, все содержимое в src / main / resources / static было окончательно показано через браузер:

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

Кажется, web / spring-webmvc - важная транзитивная зависимость, которая активирует автоматическую настройку весны загрузки.

0
ответ дан Jeff 16 August 2018 в 00:02
поделиться

Это решение работает для меня:

Сначала поставьте папку ресурсов в webapp / WEB-INF, как показано ниже:

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

Во-вторых, в конфигурационном файле весны

@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/");
    }
}

Затем вы можете получить доступ к своему ресурсу, например http: // localhost: 8080 / resource / image / yourimage.jpg

3
ответ дан ldeng 16 August 2018 в 00:02
поделиться

Вы проверили справочные документы Spring Boot ?

По умолчанию Spring Boot будет загружать статический контент из папки с именем /static (или /public или /resources или /META-INF/resources) в пути к классам или из корня ServletContext.

Вы также можете сравнить свой проект с руководством , обслуживающим веб-контент с помощью Spring MVC , или проверить исходный код образца загрузки spring-boot-sample -web-ui .

9
ответ дан matsev 16 August 2018 в 00:02
поделиться
  • 1
    Да, я это сделал, это те места, которые я пробовал, точно так же, как это было предписано документами. Но ничего не работает. Я не понимаю, почему ресурс вообще не найден. Я попытался изучить образцы, как ни странно, нет образца, который использует структуру, предложенную документами. Тот, который вы только что вставили, использует папку шаблонов, я предполагаю, что это для конфигурации или скорости тимелеафа. – Vinicius Carvalho 9 July 2014 в 20:24
  • 2
    Пример Web UI ( github.com/spring-projects/spring-boot/tree/v1.1.3.RELEASE/… ) служит для статического содержимого. – Andy Wilkinson 9 July 2014 в 21:19
  • 3
    @AndyWilkinson Спасибо, я обновил сообщение с вашей ссылкой. – matsev 10 July 2014 в 07:55
  • 4
    Я согласен с @ViniciusCarvalho, я пробовал каждую комбинацию, чтобы получить css / js в нужном месте и, похоже, не может этого сделать. Даже если я посещаю localhost: 8089 / css / styles.css, я ничего не вижу. У меня только одно правило изменить цвет тела. – Hatem Jaber 1 April 2015 в 15:53

Как было сказано выше, файл должен находиться в $ClassPath/static/images/name.png, (/ static или / public или / resources или / META-INF / resources). Этот класс $ ClassPath означает main/resources или main/java dir.

Если ваши файлы не находятся в стандартном каталоге, вы можете добавить следующую конфигурацию:

@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.
}
...

}

-1
ответ дан Mavlarn 16 August 2018 в 00:02
поделиться

Если проблема возникает при запуске приложения из среды IDE (то есть, начиная с Eclipse или IntelliJ Idea) и используя Maven, ключ к решению находится в Spring-boot Getting Started документация:

Если вы используете Maven, выполните:

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

Важная часть которого заключается в добавлении package, перед запуском приложения. (Идея: Run меню, Edit Configrations..., Add, и там выберите Run Maven Goal и укажите цель package в поле)

19
ответ дан ppeterka 16 August 2018 в 00:02
поделиться
  • 1
    Решил это для меня! У меня был контроллер, аннотированный с помощью @RestController («/ blubb»), что, очевидно, неверно, но иногда вы не видите дерево для деревьев. Изменение его на @RestController @RequestMapping (& quot; / blubb & quot;) разрешило его – zersaegen 30 July 2015 в 14:19
  • 2
    Я рад, что это помогло, и позабавило мысль, что выражение «Не может видеть леса для всех деревьев». существует и в немецком, и в шведском :) – Johannes 6 August 2015 в 12:24
  • 3
    Вы также можете явно добавить @RequestMapping («/»), если целью является как статический контент, так и динамический обработчик для запросов root. – mjj1409 17 February 2016 в 12:12
  • 4
    Ничего себе .... потратил 2 потраченных впустую дня на этот. Мое приложение mvc для загрузки Spring использует весеннюю безопасность и не видит файл styles.css. Я считаю, что безопасность не позволяла .jsp получить доступ к файлу styles.css. У меня был контроллер @RequestMapping ({"& quot ;, & quot; / & quot; / home & quot;}) в моем контроллере. Вынул "& quot; и "/ ​​& quot; и мой MVC начал работать отлично ... Очень странно. – skmansfield 26 December 2016 в 22:17
  • 5
    @Shafiul Нет Добавление как EnableAutoConfiguration, так и SpringBootApplication избыточно! & Quot; @ SpringBootApplication & Quot; содержит & quot; @ EnableAutoConfiguration & quot; – jdc91 27 July 2017 в 08:17

Ну, иногда стоит проверить, не переопределили ли вы глобальные сопоставления каким-то контроллером отдыха. Простая ошибка примера (kotlin):

@RestController("/foo")
class TrainingController {

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

}

В приведенном выше случае вы получите, когда будете запрашивать статические ресурсы:

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

Причиной этого может быть то, что вы хотели для отображения @PostMapping в /foo, но забудьте о аннотации @RequestMapping на уровне @RestController. В этом случае весь запрос сопоставляется с POST, и в этом случае вы не получите статический контент.

0
ответ дан Przemek Nowak 16 August 2018 в 00:02
поделиться

Я думаю, что предыдущие ответы очень хорошо затрагивают тему. Тем не менее, я бы добавил, что в одном случае, когда в приложении включена функция Spring Security, вам, возможно, придется специально сообщить Spring, чтобы разрешать запросы к другим статическим каталогам ресурсов, например, «/static/fonts".

В моем случае у меня были «/ static / css», «/ static / js», «/ static / images», разрешенные по умолчанию, но / static / fonts / ** были заблокированы моей реализацией Spring Security.

Ниже приведен пример того, как я исправил это.

@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
    }
.....
}
2
ответ дан RemusS 16 August 2018 в 00:02
поделиться

У меня была эта точная проблема, затем я понял, что я определил в своем приложении application.properties:

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

. Это было переопределение всего, что я пробовал. В моем случае я хотел сохранить оба, поэтому я просто сохранил свойство и добавил:

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

Кто служил файлам из src / main / resources / static как localhost: {port} /file.html .

Ни одно из вышеперечисленных не работало для меня, потому что никто не упомянул об этом небольшом свойстве, которое можно было легко скопировать из Интернета, чтобы служить другой цели;)

Надеюсь, это поможет! Понял, что это хорошо впишется в этот длинный пост ответов для людей с этой проблемой.

3
ответ дан S. Jacob Powell 16 August 2018 в 00:02
поделиться

Имела ту же проблему, используя град и затмение и потраченные часы, пытаясь понять это.

Не требуется кодирование, трюк в том, что вы должны использовать опцию меню New-> Source Folder (NOT New -> Folder), чтобы создать статическую папку в src / main / resources. Не знаю, почему это работает, но в новой -> исходной папке, тогда я назвал папку статичной (тогда в диалоговом окне исходной папки появляется ошибка, для которой вы должны проверить: обновите фильтры исключений в других папках источника для разрешения вложенности). В моей новой статической папке я добавил index.html, и теперь она работает.

0
ответ дан Vizcaino 16 August 2018 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: