Реляционная алгебра допускает взаимозаменяемость предикатов в предложении 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
Но это зависит, конечно.
Не поднимать мертвых спустя больше года, но все предыдущие ответы пропускают некоторые важные моменты:
@EnableWebMvc
на вашем классе отключит org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
. Это нормально, если вы хотите полный контроль, но в остальном это проблема. 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;
src/main/resources/static/index.html
будет использоваться, когда URL-адрес запроса /index.html
. Класс, который отвечает за разрешение пути, начиная с Spring 4.1, - org.springframework.web.servlet.resource.PathResourceResolver
. /index.html
, Spring будет искать обработчиков, соответствующих /index.html
. Это проблема, если целью является статический контент. Чтобы отключить это, продолжите WebMvcConfigurerAdapter
(но не используйте @EnableWebMvc
) и переопределите configurePathMatch
, как показано ниже: @Override
public void configurePathMatch(PathMatchConfigurer configurer) {
super.configurePathMatch(configurer);
configurer.setUseSuffixPatternMatch(false);
}
IMHO, единственный способ уменьшить количество ошибок в вашем коде не писать код, когда это возможно. Используйте то, что уже было предоставлено, даже если это потребует некоторых исследований, возвращение того стоит.
Просто добавьте еще один ответ на старый вопрос ... Люди упоминали, что @EnableWebMvc
предотвратит загрузку WebMvcAutoConfiguration
, что является кодом, ответственным за создание статических обработчиков ресурсов. Существуют и другие условия, которые предотвращают также загрузку WebMvcAutoConfiguration
. Самый простой способ увидеть это - посмотреть на источник:
В моем случае я включил библиотеку, которая имел класс, который простирался от WebMvcConfigurationSupport
, который является условием, которое предотвратит автоконфигурацию:
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
Важно, чтобы никогда не простирался от WebMvcConfigurationSupport
. Вместо этого простирайтесь от WebMvcConfigurerAdapter
.
В отличие от состояния весенней загрузки, чтобы получить мой весенний загрузочный ящик для обслуживания содержимого: мне пришлось добавить, что я зарегистрировал свой 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);
}
}
У меня была аналогичная проблема, и оказалось, что простым решением было расширение моего класса конфигурации WebMvcAutoConfiguration
:
@Configuration
@EnableWebMvc
@ComponentScan
public class ServerConfiguration extends WebMvcAutoConfiguration{
}
Мне не нужен какой-либо другой код, чтобы разрешить мой статический контент, который будет обслуживаться, однако, я поместил каталог под public
в src/main/webapp
и настроил maven, чтобы указать src/main/webapp
в качестве каталога ресурсов. Это означает, что public
копируется в target/classes
и поэтому находится на пути к классам во время выполнения для загрузки spring-boot / tomcat.
Конфигурация может быть выполнена следующим образом:
@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, а приложение развернуто в корневом контексте).
@EnableWebMvc
и WebMvcAutoConfigurationAdapter
. Большое спасибо!
– Ian Newland
22 August 2016 в 20:57
Есть две вещи, которые следует учитывать (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>
По умолчанию Spring Boot обслуживает статические ресурсы, определенные по следующим путям:
Чтобы изменить пути по умолчанию для статических ресурсов, вы можете определить атрибут "spring.resources.static-locations" в application.properties следующим образом:
spring.resources.static-locations=/html/,/js/,/css/
В вашем случае вы используете пути по умолчанию, прочитанные Spring Boot, вы не должны получать 404 при доступе к / images / , если вы явно не указали другой путь контекста для ваше приложение или вы включили @EnableWebMvc , который переопределяет конфигурацию по умолчанию Spring Boot.
Для получения дополнительной информации об обслуживании и загрузке статических ресурсов в приложении Spring Boot, проверьте следующее: Подавать статические ресурсы с помощью Spring Boot
Я использую 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 - важная транзитивная зависимость, которая активирует автоматическую настройку весны загрузки.
Это решение работает для меня:
Сначала поставьте папку ресурсов в 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
Вы проверили справочные документы Spring Boot ?
По умолчанию Spring Boot будет загружать статический контент из папки с именем
blockquote>/static
(или/public
или/resources
или/META-INF/resources
) в пути к классам или из корня ServletContext.Вы также можете сравнить свой проект с руководством , обслуживающим веб-контент с помощью Spring MVC , или проверить исходный код образца загрузки spring-boot-sample -web-ui .
Как было сказано выше, файл должен находиться в $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.
}
...
}
Если проблема возникает при запуске приложения из среды IDE (то есть, начиная с Eclipse или IntelliJ Idea) и используя Maven, ключ к решению находится в Spring-boot Getting Started документация:
Если вы используете Maven, выполните:
blockquote>
mvn package && java -jar target/gs-spring-boot-0.1.0.jar
Важная часть которого заключается в добавлении
package
, перед запуском приложения. (Идея:Run
меню,Edit Configrations...
,Add
, и там выберитеRun Maven Goal
и укажите цельpackage
в поле)
Ну, иногда стоит проверить, не переопределили ли вы глобальные сопоставления каким-то контроллером отдыха. Простая ошибка примера (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
, и в этом случае вы не получите статический контент.
Я думаю, что предыдущие ответы очень хорошо затрагивают тему. Тем не менее, я бы добавил, что в одном случае, когда в приложении включена функция 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
}
.....
}
У меня была эта точная проблема, затем я понял, что я определил в своем приложении 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 .
Ни одно из вышеперечисленных не работало для меня, потому что никто не упомянул об этом небольшом свойстве, которое можно было легко скопировать из Интернета, чтобы служить другой цели;)
Надеюсь, это поможет! Понял, что это хорошо впишется в этот длинный пост ответов для людей с этой проблемой.
Имела ту же проблему, используя град и затмение и потраченные часы, пытаясь понять это.
Не требуется кодирование, трюк в том, что вы должны использовать опцию меню New-> Source Folder (NOT New -> Folder), чтобы создать статическую папку в src / main / resources. Не знаю, почему это работает, но в новой -> исходной папке, тогда я назвал папку статичной (тогда в диалоговом окне исходной папки появляется ошибка, для которой вы должны проверить: обновите фильтры исключений в других папках источника для разрешения вложенности). В моей новой статической папке я добавил index.html, и теперь она работает.
DelegatingWebMvcConfiguration
, который имеет тот же эффект, что и при использовании@EnableWebMvc
– Aner 3 March 2016 в 22:54