查看 SPRING BOOT 中的解析器设置问题



控制台中显示的错误:

Servlet.service() for servlet [dispatcherServlet] 在带有路径 [] 的上下文中抛出了异常

[圆形视图路径 [登录]: 将调度 再次返回到当前处理程序 URL [/login]。

检查您的 视图旋转变压器设置!(提示:这可能是未指定的结果 视图,由于默认视图名称生成。有根本原因

圆形视图路径 [登录]:将调度回当前处理程序 网址 [/登录] 再次。检查您的视图旋转变压器设置!(提示:这可能是 由于默认视图名称而导致的未指定视图的结果 一代。

配置文件:

WebMvcConfig.java

package com.BasicWebMVC;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
@Bean
public BCryptPasswordEncoder passwordEncoder() {
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
return bCryptPasswordEncoder;
}


}

安全配置.java

package com.BasicWebMVC;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;


@Autowired
private DataSource dataSource;
@Value("${spring.queries.users-query}")
private String usersQuery;
@Value("${spring.queries.roles-query}")
private String rolesQuery;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().usersByUsernameQuery(usersQuery).authoritiesByUsernameQuery(rolesQuery)
.dataSource(dataSource).passwordEncoder(bCryptPasswordEncoder);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// URLs matching for access rights
.antMatchers("/").permitAll()
.antMatchers("/login").permitAll()
.antMatchers("/register").permitAll()
.antMatchers("/home/**").hasAnyAuthority("SUPER_USER", "ADMIN_USER", "SITE_USER")
.anyRequest().authenticated()
.and()
// form login
.csrf().disable().formLogin()
.loginPage("/login")
.failureUrl("/login?error=true")
.defaultSuccessUrl("/home")
.usernameParameter("email")
.passwordParameter("password")
.and()
// logout
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/").and()
.exceptionHandling()
.accessDeniedPage("/access-denied");
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**");
}
}

控制器:

身份验证控制器.java

package com.BasicWebMVC.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.BasicWebMVC.model.User;
@Controller
public class AuthenticationController {
@RequestMapping(value = { "/login" }, method = RequestMethod.GET)
public ModelAndView login() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("login"); // resources/template/login.html
return modelAndView;
}
@RequestMapping(value = "/register", method = RequestMethod.GET)
public ModelAndView register() {
ModelAndView modelAndView = new ModelAndView();
// User user = new User();
// modelAndView.addObject("user", user); 
modelAndView.setViewName("register"); // resources/template/register.html
return modelAndView;
}

@RequestMapping(value = "/home", method = RequestMethod.GET)
public ModelAndView home() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("home"); // resources/template/home.html
return modelAndView;
}
}

应用程序属性

# Database Details
spring.datasource.url=jdbc:mysql://localhost/demo
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#Spring Security login queries
#problem in this line
#security.basic.enabled=false  
spring.thymeleaf.enabled=false
spring.queries.users-query=select email, password, '1' as enabled from auth_user where email=? and status='VERIFIED'
spring.queries.roles-query=select u.email, r.role_name from auth_user u inner join auth_user_role ur on(u.auth_user_id=ur.auth_user_id) inner join auth_role r on(ur.auth_role_id=r.auth_role_id) where u.email=?

型:

用户.java

package com.BasicWebMVC.model;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name = "auth_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "auth_user_id")
private int id;
@Column(name = "first_name")
private String name;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
@Column(name = "mobile")
private String mobile;
@Column(name = "status")
private String status;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "auth_user_role", joinColumns = @JoinColumn(name = "auth_user_id"), inverseJoinColumns = @JoinColumn(name = "auth_role_id"))
private Set<Role> roles;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}

}

角色.java

package com.BasicWebMVC.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "auth_role")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "auth_role_id")
private int id;
@Column(name = "role_name")
private String role;
@Column(name = "role_desc")
private String desc;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}


}

如何解决这个问题? 提前谢谢。

@Controller更改为@RestController为我修复了此错误。

首先检查视图解析程序的配置是否正确。在您的代码中,我找不到正在配置的可能导致问题的视图解析器。在您的 application.properties 中,您禁用了 thymeleaf 视图解析器,因此 spring 不会为您自动配置它:

spring.thymeleaf.enabled=false

如果使用 Thymeleaf,则还有一个名为 ThymeleafViewResolver "百里香叶视图解析器"。它通过包围 带有前缀和后缀的视图名称。前缀是 spring.thymeleaf.prefix,后缀是spring.thymeleaf.suffix。 前缀和后缀的值默认为"类路径:/模板/" 和".html"。您可以通过以下方式覆盖 ThymeleafViewResolver 提供同名的 Bean。

还要确保在你的pom中添加了弹簧启动百里香叶依赖项:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>

如果使用 thymeleaf 作为视图解析程序并希望手动配置它,请添加以下配置或通过 application.properties 启用默认自动配置:

@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public ClassLoaderTemplateResolver templateResolver() {
var templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setPrefix("templates/");
templateResolver.setCacheable(false);
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setCharacterEncoding("UTF-8");
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setTemplateEngineMessageSource(messageSource());
return templateEngine;
}
@Bean
public ViewResolver viewResolver() {
var viewResolver = new ThymeleafViewResolver();   
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setCharacterEncoding("UTF-8");
return viewResolver;
}
}

如果您使用jsp作为视图解析程序,您可以通过appplication.ymlapplication.properties使用默认配置进行配置。但是 jsp 只能与WAR正常工作,并注意添加必要的依赖项。

spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp

如果我们没有显式注册任何 ViewResolver,则默认情况下将使用InternalResourceViewResolver的实例,其"前缀"和"后缀"属性设置为空字符串。这意味着,我们必须在应用程序中使用完整视图路径。如果不这样做,由于视图路径的构造方式,将出现圆形视图路径异常。

关于你的循环依赖关系,这里有一篇相关文章:如何使用Spring MVC测试避免"循环视图路径"异常

最新更新