Spring Boot @Autowired 字段返回 NullPointerException (使用 neo4J)

问题描述 投票:0回答:2

我正在使用 Spring Boot 和 Neo4J 制作一个小型 API,但由于某种原因,域的

@Autowired
属性在我的
null
类之一中是
@Service

自动生成的路由正确返回Neo4J数据库中的节点,所以我认为bean连接中一定存在一些错误。

控制器:

@RestController
public class NodeController {
    @PostMapping("/metrics")
    public MetricJSON computeMetrics(
            @Valid @RequestBody MetricsPayload payload,
            @Autowired SocialNetwork socialNetwork
    ) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        return new MetricJSON(socialNetwork.fromRequest(payload));
    }

@Service
班:

@Service
public class SocialNetwork  {
    @Autowired
    public NetworkRepository networkRepository;

    @Autowired
    public NodeRepository nodeRepository;

    @Autowired
    public Evolution evolution;

    public PersonalNetwork fromRequest(@NotNull MetricsPayload payload) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Network network = this.networkRepository.findById(payload.getNetworkId()).orElseThrow(NotFoundException::new);
        Node ego = this.nodeRepository.findByTag(payload.getEgoTag()).orElseThrow(NotFoundException::new);
SimpleWeightedGraph<Integer, DefaultWeightedEdge> opn = this.nodeRepository.extractOPN(ego, payload.getDepth());
        return this.fromGraph(opn, ego, payload);
}

Node
域类:

@org.springframework.data.neo4j.core.schema.Node("Node")
public class Node {
    @Id
    private String id;
    @Property("tag")
    private String tag;
    @Relationship(type = "FROM", direction = OUTGOING)
    private Set<Node> outgoingNodes;
    @Relationship(type = "TO", direction = INCOMING)
    private Set<Node> incomingNodes;
    public String getTag() {
        return tag;
    }

    public Set<Node> getOutgoingNodes() {
        return outgoingNodes;
    }

NodeRepository
班:

public interface NodeRepository extends Neo4jRepository<Node, String> {
    Optional<Node> findByTag(String tag);
}

但是,当我运行 API 时,我收到此错误:

无法完成请求:java.lang.NullPointerException:无法调用“com.api.repositories.NodeRepository.findByTag(String)”,因为“this.nodeRepository”为空

java spring-boot neo4j spring-data-neo4j
2个回答
1
投票

不支持在控制器方法中使用

@Autowired
注释。您需要将它们自动装配到类本身中。例如:

@RestController
public class NodeController {
    @Autowired
    private SocialNetwork socialNetwork; // Add this

    @PostMapping("/metrics")
    // Remove the SocialNetwork parameter from computeMetrics()
    public MetricJSON computeMetrics( 
            @Valid @RequestBody MetricsPayload payload
    ) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        return new MetricJSON(socialNetwork.fromRequest(payload));
    }
}

(最好使用构造注入,而不是使用

@Autowired
进行字段注入。)

你得到这个

NullPointerException
的原因是因为Spring会将控制器中的
socialNetwork
参数视为可以绑定请求属性的类。这会导致 Spring 创建
SocialNetwork
的新实例,但不是作为 bean。因此,在
SocialNetwork
的这个新实例中,不会发生依赖注入。

相关:为什么我的 Spring @Autowired 字段为空?


0
投票

您不应该在方法参数上使用

@Autowired
。自动装配不使用它。

将构造函数、字段、setter 方法或配置方法标记为由 Spring 的依赖注入工具自动装配。

而是创建控制器的属性并在方法中使用它

@RestController
public class NodeController {

   @Autowired SocialNetwork socialNetwork;

    @PostMapping("/metrics")
    public MetricJSON computeMetrics(
            @Valid @RequestBody MetricsPayload payload
            
    ) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        return new MetricJSON(socialNetwork.fromRequest(payload));
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.