【问题标题】:Java ServiceImpl Methods keep returning nullJava ServiceImpl 方法不断返回 null
【发布时间】:2020-01-13 07:55:48
【问题描述】:

我是使用 MVC 和 spring 的新手,并且在添加服务文件时遇到了问题。我有 3 个文件:Controller.java、Service.java 和 ServiceImpl.java。我的目标是将现有 Controller 类中的所有当前服务逻辑移动到服务级别,所以我知道方法中的逻辑不是问题。我面临的问题是我尝试从服务调用的所有方法Controller.java 中的 .java 返回 null 并导致空指针错误。

我已经看到了许多自动装配变量为空的解决方案,但我很确定这不是我的问题。

Controller.java

package project.controller;

import project.type.ServiceType;
import project.service.Service;

@Controller
public class Controller {
    @Autowired
    private final Service service;

    @Autowired
    public Controller(final Service service) {
        this.service = service;
    }

@RequestMapping(method = RequestMethod.POST)
    public @ResponseBody Object post() {

        ServiceType var1 = service.serviceMethod(true); ---> always sets var1 to null
        service.serviceMethod2(var1); ---> Throws NPE

        switch (var1) {
            case SUCCESS:
                return "Success";
            case FAILURE:
                return "Failure";
            default:
                return null;
        }
    }
}

Service.java

package project.service;

public interface Service{
    public ServiceType serviceMethod(boolean bool);
    public ServiceType serviceMethod2(ServiceType serviceType);
}

ServiceImpl.java

package project.service.impl;

import project.type.ServiceType;
import project.service.Service;

@Service
public class ServiceImpl implements Service{

    @Override
    public ServiceType serviceMethod(boolean bool){
       if(bool){
          return ServiceType.SUCCESS;
       }
       return ServiceType.FAILURE;
    }

    @Override
    public ServiceType serviceMethod2(ServiceType serviceType){
       *calculate*
    }
}

ServiceType.java

package project.type;

public enum ServiceType {
    SUCCESS,
    FAILURE
}

ServiceConfig.java

package project.config;

import Service;
import ServiceImpl;

@Configuration
public class ServiceConfig {
    @Bean
    public Service Service() {
        return new ServiceImpl();
    }
}

在 IntelliJ 中可以看到我的服务变量 = "service" 所以它似乎是从正确的位置拉出的。

我已尽力以通用方式重新创建我的代码。我觉得缺少一些可能导致此问题的小连接,因此非常感谢您对为什么会发生这种情况的任何想法!

【问题讨论】:

  • 请包含实际的服务实现而不是存根。此外,除非您的控制器中有构造函数或非最终字段,否则您的代码也不会编译。所以请显示实际代码而不是类似的代码。
  • @M.Deinum 我已尝试尽可能多地更新,但无法共享完整代码,因为它属于我的公司。我需要解决的主要问题是为什么 var1 设置为 null。特别是该方法与我的真实代码基本相同,理论上应该总是返回 something
  • 更改您的代码以使用构造函数注入而不是字段注入,然后更新我们。
  • 除非你有一些糟糕的@Around@After 方面会扰乱你的服务。您的服务方法也应该是public,并且如前所述,控制器中的final 字段不会让代码编译。至少 post code 是有代表性的,当前的 code 真的不是。
  • 我们看到的代码中一定还有一些东西。我的意思是,在控制器中,您调用的是service.serviceMethod();(没有传递参数)。但是在您的服务中,此方法需要一个参数boolean bool。所以,这两种方法不一样

标签: java spring service null autowired


【解决方案1】:

似乎从 serviceMethod() 返回的 ServiceType 对象为空。因为您可以使用服务@Autowired 调用 serviceMethod()。检查你的 serviceMethod() 实现。

【讨论】:

  • 抱歉误导性代码。我已经更新它以更好地反映我的 serviceMethod 功能
  • 这不是问题的真正答案,这应该是改进问题的评论。
【解决方案2】:

请补充

@ComponentScan(basePackages = "project")
@Configuration

在您的配置文件中。春天必须知道从哪里采摘豆子。

随着您方法的可见性变化

    public ServiceType serviceMethod(boolean bool){
      if(bool){
          return ServiceType.SUCCESS;
       }
       return ServiceType.FAILURE;
    }
public ServiceType serviceMethod2(ServiceType serviceType){
       /**calculate**/  
        return ServiceType.SUCCESS;
    }

【讨论】:

  • 正在注入bean,方法调用的结果是null,如果一定要相信OP的话。
猜你喜欢
  • 2015-02-15
  • 2014-12-22
  • 2016-07-01
  • 1970-01-01
  • 2012-05-11
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多