我正在使用 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”为空
不支持在控制器方法中使用
@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
的这个新实例中,不会发生依赖注入。
@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));
}
}