Spring Boot + Thymeleaf CSS文件无法访问并出现500错误,找不到模板

时间:2018-08-28 13:16:20

标签: spring-boot thymeleaf

当我使用Spring Boot 1.4.0 + Thymeleaf时,我发现静态资源无法访问并抛出错误“模板可能不存在,或者任何已配置的模板解析器都无法访问”。

Folder structure about my static resources

Browser show 500 error

从服务器日志中,可以找到错误“找不到模板”。但是URL应该是我的CSS文件位置。

2018-08-28 21:07:29.826 ERROR 5676 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template "Spring Boot Application is available.", template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause

2 个答案:

答案 0 :(得分:0)

听起来好像Spring Boot试图将资源路径解析为模板。通往其中一个控制器的路径可能存在冲突。默认情况下,Spring Boot提供来自import React, { Component } from 'react'; import {View, Image, TextInput} from 'react-native'; import { Container, Header, Content, Button, Icon, Body, Left, Right, Text, Title, Card, CardItem } from 'native-base'; import styles from '../Style/Style.js' import Foect from 'foect'; import IconNew from 'react-native-vector-icons/MaterialIcons'; export default class AnmeldeScreen extends Component { constructor(props) { super(props); this.state = { icEye: 'visibility-off', password: true, } } static navigationOptions = { header: null } changePwdType = () => { let newState; if (this.state.password) { newState = { icEye: 'visibility', password: false } } else { newState = { icEye: 'visibility-off', password: true } } // set new state value this.setState(newState) }; render () { var {navigate} = this.props.navigation; return ( <Container> {/*---------------------------------------------------- H E A D E R ------------------------------------------------------------*/} <Header> <Left> <Button transparent onPress={() => navigate("Start", {})}> <Icon name="arrow-back" /> </Button> </Left> <Body> <Title style={styles.titelintervall}>Registrieren</Title> </Body> <Right> </Right> </Header> {/*---------------------------------------------------- C O N T E N T ------------------------------------------------------------*/} <Content padder> <Image source={require('../images/low-carb-camp-logo-breit.png')} style={styles.secondimagelogo} /> <Foect.Form defaultValue={{ email: '' }} onValidSubmit={model => { console.log(model); }} > { /* you can use form for triggering submit or checking form state(form.isSubmitted, form.isValid, ...) */ } { form => ( <View> { /* every Foect.Control must have a name and optionally validation rules */ } <Foect.Control name="fullName" required minLength={2} maxLength={32}> { /* you can use control for getting/setting it's value, checking/updating(control.isValid, control.markAsTouched(), ...) it's state, checking it's errors(control.errors.required) */ } { control => ( <View> <Text style={{ marginTop: 10, color: '#8BC051' }}>Dein Name</Text> <TextInput style={{height: 40, borderColor: 'gray', borderBottomWidth: 1}} /* mark control as touched on blur */ onBlur={control.markAsTouched} /* update control's value */ onChangeText={(text) => control.onChange(text)} /* get control's value */ value={control.value} placeholder="Hier vollständigen Namen eingeben" /> { /* check control state and show error if necessary */ } { control.isTouched && control.isInvalid && <Text style={{ color: 'red' }}>Bitte trage deinen Namen ein.</Text> } </View> ) } </Foect.Control> <Foect.Control name="email" required email> { control => ( <View> <Text style={{ marginTop: 10, color: '#8BC051' }}>Email</Text> <TextInput style={{height: 40, borderColor: 'gray', borderBottomWidth: 1}} keyboardType="email-address" onBlur={control.markAsTouched} onChangeText={(text) => control.onChange(text)} value={control.value} placeholder="Hier E-Mail eingeben" /> { control.isTouched && control.isInvalid && <View> <Text style={{ color: 'red'}}>{control.value} ist keine gültige E-Mail</Text> </View> } </View> ) } </Foect.Control> <Foect.Control name="password" required pattern={/(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/}> { control => ( <View> <Text style={{ marginTop: 10, color: '#8BC051' }}>Passwort </Text> <TextInput style={{height: 40, borderColor: 'gray', borderBottomWidth: 1}} secureTextEntry={true} onBlur={control.markAsTouched} onChangeText={(text) => control.onChange(text)} value={control.value} secureTextEntry={this.state.password} placeholder="Passwort erstellen" /> <IconNew style={styles.icon} name={this.state.icEye} size={25} color={this.props.iconColor} onPress={this.changePwdType} /> { control.isTouched && control.isInvalid && <View> { control.errors.pattern ? <Text style={{ color: 'red' }}>Dein Passwort muss mindestens 8 Zeichen lang sein und mindestens ein Sonderzeichen oder eine Zahl enthalten.</Text> : <Text style={{ color: 'red' }}>Bitte trage dein Passwort ein.</Text> } </View> } </View> ) } </Foect.Control> <Foect.Control name="confirmpassword"> { control => ( <View> <Text style={{ marginTop: 10, color: '#8BC051' }}>Passwort wiederholen </Text> <TextInput style={{height: 40, borderColor: 'gray', borderBottomWidth: 1}} secureTextEntry={true} onBlur={control.markAsTouched} onChangeText={(text) => control.onChange(text)} value={control.value} placeholder="Passwort bitte wiederholen" /> </View> ) } </Foect.Control> </View> ) } </Foect.Form> <View style={{marginTop: 10}}> <Button full warning style={styles.buttonintervall} onPress={ () => navigate("Ziel", {})}>>> <Text>Registrieren</Text> </Button> </View> <Text style={styles.secondtextfb}> oder </Text> <Card> <CardItem> <Icon name="logo-facebook" style={{color: '#234c6e'}} /> <Text>Über Facebook registrieren</Text> <Right> <Icon name="arrow-forward" /> </Right> </CardItem> </Card> </Content> </Container> ); } } 的静态资源。您可以使用/**application.properties文件中更改此默认路径。

spring.mvc.static-path-pattern

这将为您的静态内容提供新的资源路径

boostrap.min.css

## application.properties spring.mvc.static-path-pattern=/resources/**

  

https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-static-content

答案 1 :(得分:0)

检查我的源代码后,我发现这是因为我有另一个控制器将请求映射到主页并阻止了CSS / JS URL。在评论函数test2()之后,主页现在可以加载静态资源。

@RequestMapping(value = "/")
public String test1(){
    return "index";
}

@RequestMapping
public String test2(){
    return "index";
}