Spring security 为什么在添加了spring安全性之后会出现空指针异常?

Spring security 为什么在添加了spring安全性之后会出现空指针异常?,spring-security,nullpointerexception,Spring Security,Nullpointerexception,在将spring安全性添加到我的项目之后,我不断得到一个NullPointerException。三天来我一直在努力寻找错误。没有任何意义,因为我几乎是从另一个工作正常的类似服务器复制粘贴代码 控制器: @RestController @RequestMapping(value = "/order") public class OrderController { @Autowired private OrderService orderService;

在将spring安全性添加到我的项目之后,我不断得到一个NullPointerException。三天来我一直在努力寻找错误。没有任何意义,因为我几乎是从另一个工作正常的类似服务器复制粘贴代码

控制器:

@RestController
@RequestMapping(value = "/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @PreAuthorize("hasAuthority('make:orders')")
    @PostMapping(value = "/new")
    private void newOrder(@RequestBody OrderVO orderVO){
        orderService.newOrder(orderVO);
    }

    @PreAuthorize("hasAuthority('see:orders')")
    @GetMapping(value = "/getOrdersByUserId")
    private List<OrderVO> getOrders(@RequestParam("id") int id){

        return orderService.getOrdersByUserId(id);
    }

    @PreAuthorize("hasAuthority('see:orders')")
    @GetMapping(value = "/getAllOrders")
    private List<OrderVO> getAllOrders(){

        return orderService.getAllOrders();
    }
}
服务实施:

@Service
@Transactional
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {

        Optional<User> optionalUser = userRepository.findByUserName(s);

        optionalUser.orElseThrow(() -> new UsernameNotFoundException("Username not found"));

        return optionalUser.map(UserDetailsModel::new).get();
    }
}
如果有任何需要更多的代码,我将很乐意添加它

订单服务:

public interface OrderService {

    void newOrder(OrderVO orderVO);

    List<OrderVO> getOrdersByUserId(int id);

    List<OrderVO> getAllOrders();
}
公共接口OrderService{ 作废新订单(OrderVO OrderVO); 列出getOrdersBySerID(int id); 列出getAllOrders(); } OrderServiceImpl:

@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    
    private final OrderProductRepository orderProductRepository;
    
    private final ProductRepository productRepository;
    
    private final OrderRepository orderRepository;
    
    private final UserRepository userRepository;

    @Autowired
    public OrderServiceImpl(OrderProductRepository orderProductRepository, ProductRepository productRepository, OrderRepository orderRepository, UserRepository userRepository) {
        this.orderProductRepository = orderProductRepository;
        this.productRepository = productRepository;
        this.orderRepository = orderRepository;
        this.userRepository = userRepository;
    }

    @Override
    public void newOrder(OrderVO orderVO) {

        Optional<User> userResponse = userRepository.findById(orderVO.getUserId());
        User user = userResponse.orElse(new User());
        Orders order = new Orders(user);
        orderRepository.save(order);
        
        List<ProductVO> productVOS = orderVO.getOrderProducts();
        for (ProductVO p : productVOS) {

            Optional<Product> productResponse = productRepository.findById(p.getId());
            Product product = productResponse.orElse(new Product());
            product.setAmount(product.getAmount() - p.getAmountOfOrderedProducts());
            product.setUser(user);
            productRepository.save(product);
            
            orderProductRepository.saveOrderProduct(product.getId(), order.getId(), p.getAmountOfOrderedProducts());
        }
    }

    @Override
    public List<OrderVO> getOrdersByUserId(int id) {

        List<Orders> orders = orderRepository.findByUserId(id);

        return getOrders(orders);
    }

    @Override
    public List<OrderVO> getAllOrders() {
        
        List<Orders> orders = (List<Orders>) orderRepository.findAll();
        return getOrders(orders);
    }

    List<OrderVO> getOrders(List<Orders> orders) {

        List<OrderProduct> orderProduct = new ArrayList<>();

        for (Orders o : orders) {
            List<OrderProduct> op = orderProductRepository.findByOrderId(o.getId());
            orderProduct.addAll(op);
        }

        Stack<OrderVO> orderz = new Stack<>();

        for (OrderProduct op : orderProduct) {

            Optional<Orders> orsResponse = orderRepository.findById(op.getOrders().getId());
            Orders oro = orsResponse.orElse(new Orders());
            OrderVO order = new OrderVO((long) oro.getId(), oro.getUser().getId(), oro.getCreatedOn());

            Optional<Product> pResponse = productRepository.findById(op.getProduct().getId());
            Product p = pResponse.orElse(new Product());
            ProductVO pVO = new ProductVO(p.getId(), p.getName(), op.getAmountOfOrderedProduct());

            if (orderz.empty() || orderz.peek().getOrderId() != order.getOrderId()) {
                order.getOrderProducts().add(pVO);
                orderz.push(order);
            } else {
                OrderVO o = orderz.pop();
                o.getOrderProducts().add(pVO);
                orderz.push(o);
            }
        }
        return orderz;
    }
}
@服务
@交易的
公共类OrderServiceImpl实现OrderService{
私有最终OrderProductRepository OrderProductRepository;
私有最终产品存储库产品存储库;
私有最终订单存储库订单存储库;
私有最终用户存储库用户存储库;
@自动连线
public OrderServiceImpl(OrderProductRepository OrderProductRepository、ProductRepository ProductRepository、OrderRepository OrderRepository、UserRepository UserRepository){
this.orderProductRepository=orderProductRepository;
this.productRepository=productRepository;
this.orderRepository=orderRepository;
this.userRepository=userRepository;
}
@凌驾
公共作废新订单(OrderVO OrderVO){
可选的userResponse=userRepository.findById(orderVO.getUserId());
User=userResponse.orElse(新用户());
订单=新订单(用户);
orderRepository.save(订单);
List productVOS=orderVO.getOrderProducts();
for(productVOP:productVOS){
可选productResponse=productRepository.findById(p.getId());
Product=productResponse.orElse(新产品());
product.setAmount(product.getAmount()-p.getAmountForderedProducts());
product.setUser(用户);
productRepository.save(产品);
orderProductRepository.saveOrderProduct(product.getId()、order.getId()、p.GetAmountForderedProducts());
}
}
@凌驾
公共列表GetOrdersBySerID(int id){
List orders=orderRepository.findByUserId(id);
返回订单(订单);
}
@凌驾
公共列表getAllOrders(){
List orders=(List)orderRepository.findAll();
返回订单(订单);
}
列出订单(列出订单){
List orderProduct=new ArrayList();
对于(订单o:订单){
List op=orderProductRepository.findByOrderId(o.getId());
orderProduct.addAll(op);
}
堆栈顺序z=新堆栈();
对于(OrderProduct op:OrderProduct){
可选orsResponse=orderRepository.findById(op.getOrders().getId());
Orders oro=orResponse.orElse(new Orders());
OrderVO order=neworderVO((长)oro.getId(),oro.getUser().getId(),oro.getCreatedOn());
可选的pResponse=productRepository.findById(op.getProduct().getId());
产品p=pResponse.orElse(新产品());
ProductVO pVO=new ProductVO(p.getId(),p.getName(),op.getAmountoforedProduct());
if(orderz.empty()| | orderz.peek().getOrderId()!=order.getOrderId()){
order.getOrderProducts().add(pVO);
orderz.push(订单);
}否则{
OrderVO o=orderz.pop();
o、 getOrderProducts().add(pVO);
顺序推(o);
}
}
退货订单Z;
}
}

正如堆栈跟踪所说,调用
OrderController
时,属性
orderService
为空。我理解这意味着问题不在于spring安全性,尽管没有它代码运行正常。有什么办法可以解决吗?是的,我认为问题在于你的代码中,bean还没有被创建,这就是为什么它是空的,这个主题可以帮助你已经查看了那篇文章,他遇到的问题是他用new实例化了一个服务,我认为这是一个我没有遇到的问题。我想我把所有东西都自动连线了。如果我在问题中添加OrderServiceImpl和我的OrdersService会有帮助吗?添加了两者,希望有帮助。第35行是
returnOrderService.getAllOrders(),对吗?您的
orderService
是空的。第35行是“return orderService.getAllOrders();”问题是我不知道为什么它是空的,它应该正确地自动连接,加上在添加spring安全性之前用于正常工作的代码,这与orderService没有任何关系。在这里没有什么意义。顺便说一句,感谢您检查代码。我想知道,为什么堆栈跟踪不包含代理。读了上面的问题后,我想起几年前我也有同样的问题。如果您的控制器方法是私有的,那么就不可能有AOP,也不可能使用代理。就是这样!我看了好几天代码都没有找到错误。爱你,我真的爱你。谢谢你,先生!
2020-09-15 18:18:06.047 ERROR 276 --- [nio-8023-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException: null
    at com.carlsberg.orderservice.controllers.OrderController.getAllOrders(OrderController.java:35) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:155) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) ~[spring-security-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
public interface OrderService {

    void newOrder(OrderVO orderVO);

    List<OrderVO> getOrdersByUserId(int id);

    List<OrderVO> getAllOrders();
}
@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    
    private final OrderProductRepository orderProductRepository;
    
    private final ProductRepository productRepository;
    
    private final OrderRepository orderRepository;
    
    private final UserRepository userRepository;

    @Autowired
    public OrderServiceImpl(OrderProductRepository orderProductRepository, ProductRepository productRepository, OrderRepository orderRepository, UserRepository userRepository) {
        this.orderProductRepository = orderProductRepository;
        this.productRepository = productRepository;
        this.orderRepository = orderRepository;
        this.userRepository = userRepository;
    }

    @Override
    public void newOrder(OrderVO orderVO) {

        Optional<User> userResponse = userRepository.findById(orderVO.getUserId());
        User user = userResponse.orElse(new User());
        Orders order = new Orders(user);
        orderRepository.save(order);
        
        List<ProductVO> productVOS = orderVO.getOrderProducts();
        for (ProductVO p : productVOS) {

            Optional<Product> productResponse = productRepository.findById(p.getId());
            Product product = productResponse.orElse(new Product());
            product.setAmount(product.getAmount() - p.getAmountOfOrderedProducts());
            product.setUser(user);
            productRepository.save(product);
            
            orderProductRepository.saveOrderProduct(product.getId(), order.getId(), p.getAmountOfOrderedProducts());
        }
    }

    @Override
    public List<OrderVO> getOrdersByUserId(int id) {

        List<Orders> orders = orderRepository.findByUserId(id);

        return getOrders(orders);
    }

    @Override
    public List<OrderVO> getAllOrders() {
        
        List<Orders> orders = (List<Orders>) orderRepository.findAll();
        return getOrders(orders);
    }

    List<OrderVO> getOrders(List<Orders> orders) {

        List<OrderProduct> orderProduct = new ArrayList<>();

        for (Orders o : orders) {
            List<OrderProduct> op = orderProductRepository.findByOrderId(o.getId());
            orderProduct.addAll(op);
        }

        Stack<OrderVO> orderz = new Stack<>();

        for (OrderProduct op : orderProduct) {

            Optional<Orders> orsResponse = orderRepository.findById(op.getOrders().getId());
            Orders oro = orsResponse.orElse(new Orders());
            OrderVO order = new OrderVO((long) oro.getId(), oro.getUser().getId(), oro.getCreatedOn());

            Optional<Product> pResponse = productRepository.findById(op.getProduct().getId());
            Product p = pResponse.orElse(new Product());
            ProductVO pVO = new ProductVO(p.getId(), p.getName(), op.getAmountOfOrderedProduct());

            if (orderz.empty() || orderz.peek().getOrderId() != order.getOrderId()) {
                order.getOrderProducts().add(pVO);
                orderz.push(order);
            } else {
                OrderVO o = orderz.pop();
                o.getOrderProducts().add(pVO);
                orderz.push(o);
            }
        }
        return orderz;
    }
}