springboot里有几个方法无法被访问到(其它的方法正常访问)

出问题的控制器

package com.ggg.dangdang1.controller;


import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ggg.dangdang1.entity.Address;
import com.ggg.dangdang1.entity.Item;
import com.ggg.dangdang1.entity.Order;
import com.ggg.dangdang1.entity.User;
import com.ggg.dangdang1.service.IItemService;
import com.ggg.dangdang1.service.IOrderService;
import com.ggg.dangdang1.vo.Cart;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author ggg
 * @since 2024-06-23
 */
@RestController
@RequestMapping("/order")
@CrossOrigin(origins = "*")
public class OrderController {
    @Autowired
    private IOrderService orderService;
    @Autowired
    private IItemService itemService;

    @GetMapping("/getOrderByPage")
    public Page<Order> getOrderByPage(Integer pageNum, HttpSession session){
        User user = (User) session.getAttribute("token");
        return orderService.page(new Page<>(pageNum, 10), Wrappers.<Order>lambdaQuery().eq(Order::getUserId,user.getUserId()));
    }



    @PostMapping("/createOrder")
    public Order createOrder(@RequestBody Address address){
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        Cart cart = (Cart) requestAttributes.getAttribute("cart", RequestAttributes.SCOPE_SESSION);
        Order order = new Order();
        order.setStatus("UNPay");
        BeanUtils.copyProperties(address,order);
        order.setCreateDate(LocalDateTime.now());
        String orderId = String.valueOf(IdUtil.getSnowflake().nextId());
        order.setOrderId(orderId);
        order.setTotal(cart.getTotalPrice());
        orderService.save(order);
        List<Item> items = new ArrayList<>();
        cart.getBooks().forEach((k,v)->items.add(new Item(null,k,v.getCount(),LocalDateTime.now(),order.getOrderId())));
        itemService.saveBatch(items);
        //requestAttributes.removeAttribute("cart",RequestAttributes.SCOPE_SESSION);
        return order;
    }

    @GetMapping("/delOrderById")
    public void delOrderById(String orderId){
        LambdaQueryWrapper<Item> queryWrapper=new LambdaQueryWrapper<>();
        queryWrapper.eq(Item::getOrderId,orderId);
        itemService.remove(queryWrapper);
        orderService.removeById(orderId);
    }

    @GetMapping("/getOrderById")
    public Order getOrderById(String orderId){

        System.out.println("aaaa");
        return orderService.getById(orderId);
    }
}

其它模块运转良好,解决跨域问题的两个类

package com.ggg.dangdang1.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//处理跨域资源共享(CORS)
@Component
public class AccessInterceptor implements HandlerInterceptor {
    //HandlerInterceptor接口中的方法,在请求到达控制器之前执行。它返回一个布尔值,如果返回true,请求将继续处理;如果返回false,请求将被中止。
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("aa");
//设置响应头Access-Control-Allow-Origin,其值为请求头中的Origin。表明允许所有来源的跨域请求。
//        response.setHeader("Access-Control-Allow-Origin","*");
        response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials","true");
        response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
//        header("Access-Control-Allow-Origin: *");
        //支持post请求
        response.setHeader("P3P","CP=CAO PSA OUR");
        if("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setHeader("Access-Control-Allow-Headers", "Content-Type,Origin,Accept");
            response.setHeader("Access-Control-Allow-Methods", "POST,GET,HEAD,PUT,DELETE,TRACE,OPTIONS");
            //设置预检请求的结果在缓存中的最长时间(秒),在这个时间内,不需要再次发送预检请求。
            response.setHeader("Access-Control-Max-Age","18000");
        }
        //返回true,表示请求继续处理,控制器可以正常执行。
        return true;
    }
}

package com.ggg.dangdang1.interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("a");
        Object flag = request.getSession().getAttribute("token");
        if (ObjectUtils.isEmpty(flag)){
            ObjectMapper objectMapper = new ObjectMapper();
            ServletOutputStream outputStream = response.getOutputStream();
            outputStream.print(objectMapper.writeValueAsString(new HashMap<String,Integer>(){{
                put("status",0616);
            }}));
            return false;
        }
        return true;
    }
}

package com.ggg.dangdang1.config;


import com.ggg.dangdang1.interceptor.AccessInterceptor;
import com.ggg.dangdang1.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private AccessInterceptor accessInterceptor;
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(accessInterceptor)
                .addPathPatterns("/**");
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/address/*","/cart/*","/item/*","/order/*")
                .excludePathPatterns("/cart/getCartBookNum");
    }
}




很难受,不知道问题出在哪里,求大佬解答

2 个赞

Integer xx = 0616; 结果就是398
为啥integer前面要加0?

2 个赞

没看懂问题是什么,接口不是通的吗

就是这几个cartcontroller里的方法没办法正常被访问到,但是同级里的其它方法是正常的,它们用的拦截器也是相同的

你的意思是并没有执行对应的方法,但是又确实到后台访问了一下,返回的不是预期的数据吧,把后台日志开到debug留意全局异常处理器别啥都捕获了也许有收获

这不是跨域了吗


order 加这个了啊

既然返回的是status 398,找到返回用到这个地方的位置,那就是被调用的最深处了,再看看为什么会调到了那边

哦 原来你说的是 getOrder 这个啊 我还以为是 cart/changeBook呢

首先:status:398 是哪写的,您的截图里没有这部分代码

是不是哪里报错了 还设置exceptionHandler 了

看不懂 ,找大佬吧

源码搜一下398应该是被什么前置拦截了

400 错误码是前端请求方式、参数不对

你看你写的这个返回0616,和你这个398的json,是一样的,你不会引用了什么基础包吧


package com.ggg.dangdang1.interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("a");
        Object flag = request.getSession().getAttribute("token");
        if (ObjectUtils.isEmpty(flag)){
            ObjectMapper objectMapper = new ObjectMapper();
            ServletOutputStream outputStream = response.getOutputStream();
            outputStream.print(objectMapper.writeValueAsString(new HashMap<String,Integer>(){{
                put("status",0616);
            }}));
            return false;
        }
        return true;
    }
}

有时候提示跨域并不是请求跨域了,是后台异常了,似乎是/error的时候跨域了

把拦截器都取消,在请求试试,然后一个一个恢复

springboot的拦截器有时候用不太明白

1 个赞

配置文件里 debug=true, 大概率可以看到一些额外的信息
顺便 跟楼上一样,把拦截器全部取消,然后一点一点的加,100%可以确认哪里出问题