SpringBoot Circular view path错误

博客围绕Spring Boot 2.7.11构建Controller展开,目标是根据用户名和密码返回视图名或错误JSON串。但手动返回JSON字符串时控制器方法返回null,会导致Circular view path错误,根本原因是处理器方法返回null,Spring会按URL推测视图名,引发URL与VIEW同名问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值