SpringBoot 2.7.11,构建Controller,想实现的效果是获得正确的用户名和密码就返回视图的名称,否则返回标表示错误的JSON字符串。
@Controller
public class JsonDemoController {
private static final Logger logger = LoggerFactory.getLogger(JsonDemoController.class);
@Autowired
ObjectMapper mapper;
@RequestMapping("/userLogin")
public String userLoginHandler(@RequestParam(required = false) String username,
@RequestParam(required = false) String password,
Model model,
NativeWebRequest request) throws IOException {
logger.info("username:{},password:{}",username,password);
if("tom".equals(username) && "123456".equals(password)){
model.addAttribute("user",username);
return "user";
}else {
HttpServletResponse response = request.getNativeResponse(HttpServletResponse.class);
response.setContentType("application/json;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write(mapper.writeValueAsString(ErrorMessage.USERNAMEORPASSWORDERROR));
//writer.flush();
writer.close();
return null;
}
}
}
控制器的逻辑非常简单,但是在“手动”返回ObjectMappger的JSON字符串时作为响应控制器方法返回null,会导致Circular view path。
导致Circular view path错误的根本原因在于一个本该返回视图名称的处理器方法返回了null,而如果处理返回null或者干脆处理方法的返回值是void,在没有额外注解的情况下(例如@ResponseStatus或@ResponseBody),Spring会开始尝试根据访问的URL来推测使用视图的名称。这样就会导致产生Circular view path错误的温床,也就是URL PATH与VIEW同名。在本例中就是URL和Spring推测出来的VIEW都是userLogin。而产生这种推测行为的始作俑者是RequestToViewNameTranslator
接口的实现类 DefaultRequestToViewNameTranslator。