我正在使用 spring-boot 和 Neo4J 制作一个小型 api,但由于某种原因,域的
@autowired
属性在我的 @Service
类之一中为空。自动生成的路由正确地从 Neo4J 数据库返回节点,所以我认为它们一定是 beans 连接中的一些错误
控制器:
@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 时,我收到此错误:
Failed to complete request: java.lang.NullPointerException: Cannot invoke "com.api.repositories.NodeRepository.findByTag(String)" because "this.nodeRepository" is null
在控制器方法中使用
@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));
}
}