com.project.api.graphql.service.GraphQLService中构造函数的参数0需要类型为';java.lang.String';那是找不到的
我是Spring Boot新手,我想知道这个错误消息 我正在尝试创建一个GraphQL类来连接到各种GraphQL配置,并希望将一个值传递给构造函数(最终用于我的类路径): 我正在使用一个如何将GraphQL连接到Spring Boot的示例,我有几个地方使用了注释@Autowired以及@PostConstruct。我觉得其中一个问题正导致我所看到的问题 完全错误如下所示:com.project.api.graphql.service.GraphQLService中构造函数的参数0需要类型为';java.lang.String';那是找不到的,java,spring,spring-boot,graphql,Java,Spring,Spring Boot,Graphql,我是Spring Boot新手,我想知道这个错误消息 我正在尝试创建一个GraphQL类来连接到各种GraphQL配置,并希望将一个值传递给构造函数(最终用于我的类路径): 我正在使用一个如何将GraphQL连接到Spring Boot的示例,我有几个地方使用了注释@Autowired以及@PostConstruct。我觉得其中一个问题正导致我所看到的问题 完全错误如下所示: Description: Parameter 0 of constructor in com.project.api.
Description:
Parameter 0 of constructor in com.project.api.graphql.service.GraphQLService required a bean of type 'java.lang.String' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'java.lang.String' in your configuration.
我该如何解决这个问题?我不能使用带有自动连线或后构造批注的自定义构造函数吗?首先介绍一些有关依赖项注入的信息。如果您使用SpringDI(依赖项注入),请不要使用new关键字来创建“bean”依赖项的实例。让我来帮你处理。 另一个建议是使用有用的名称。“值”这个名字不好,因为值可以是一切。命名所有内容,使其具有有意义的名称 您给出的代码示例不完整。可能在GraphQLService类中有一个@Service注释。因为Spring试图在启动时启动te服务bean。因为您在该类的构造函数中定义了一个字符串,所以Spring尝试自动关联该依赖项。一个简单的字符串不是一个已知的bean,因为您得到了错误
请阅读Spring文档,了解其工作原理。也许还可以看看,阅读文档,看看一些例子。这让您很好地了解了Spring是如何解决这类问题的。首先是关于依赖项注入的一些信息。如果您使用SpringDI(依赖项注入),请不要使用new关键字来创建“bean”依赖项的实例。让我来帮你处理。 另一个建议是使用有用的名称。“值”这个名字不好,因为值可以是一切。命名所有内容,使其具有有意义的名称 您给出的代码示例不完整。可能在GraphQLService类中有一个@Service注释。因为Spring试图在启动时启动te服务bean。因为您在该类的构造函数中定义了一个字符串,所以Spring尝试自动关联该依赖项。一个简单的字符串不是一个已知的bean,因为您得到了错误
请阅读Spring文档,了解其工作原理。也许还可以看看,阅读文档,看看一些例子。这让您很好地了解了Spring是如何解决这类问题的。与评论中提到的michalk一样,您在
文章资源中滥用了依赖项注入
——我强烈建议您阅读Spring的文档
基本上就是这样:您试图满足的依赖关系,在本例中,GraphQLService
有一个构造函数和一个String类型的参数。Spring将尝试注入它,但由于您在项目中没有定义字符串类型的@Bean
,因此它将失败,并显示您提供的错误消息
在您的情况下,更有意义的是定义一个@Configuration
类,并从例如application.properties中注入字符串值,如下所示:
@Configuration
public class GraphQLConfig {
@Bean
public GraphQLService graphQLService(@Value("${classpath.value}") String valueReadFromAppProperties) {
return new GraphQLService(valueReadFromAppProperties);
}
}
然后将以下内容添加到应用程序.properties文件中:
classpath.value=classpath:articles.graphql
最后,在ArticleResource中注入服务实例时:
public class ArticleResource {
@Autowired
GraphQLService graphQLService;
... other code
}
虽然可以通过使用构造函数注入而不是字段注入来改进:
public class ArticleResource {
private GraphQLService graphQLService;
public ArticleResource(GraphQLService graphQLService) {
this.graphQLService = graphQLService;
}
}
就像michalk在评论中已经提到的那样,您在
文章资源中滥用依赖注入-我强烈建议您阅读spring的文档
基本上就是这样:您试图满足的依赖关系,在本例中,GraphQLService
有一个构造函数和一个String类型的参数。Spring将尝试注入它,但由于您在项目中没有定义字符串类型的@Bean
,因此它将失败,并显示您提供的错误消息
在您的情况下,更有意义的是定义一个@Configuration
类,并从例如application.properties中注入字符串值,如下所示:
@Configuration
public class GraphQLConfig {
@Bean
public GraphQLService graphQLService(@Value("${classpath.value}") String valueReadFromAppProperties) {
return new GraphQLService(valueReadFromAppProperties);
}
}
然后将以下内容添加到应用程序.properties文件中:
classpath.value=classpath:articles.graphql
最后,在ArticleResource中注入服务实例时:
public class ArticleResource {
@Autowired
GraphQLService graphQLService;
... other code
}
虽然可以通过使用构造函数注入而不是字段注入来改进:
public class ArticleResource {
private GraphQLService graphQLService;
public ArticleResource(GraphQLService graphQLService) {
this.graphQLService = graphQLService;
}
}
似乎GraphQLService
没有其他构造函数,因此它将尝试调用该构造函数。由于您可能没有在任何地方定义String
bean,因此会出现错误。考虑定义没有ARGS构造函数或定义一个bean“代码>字符串< /代码>类型。这完全取决于你想要实现什么。您还可以从属性文件中注入此值,这实际上更有意义。此外,在本例中,由于使用new
关键字创建实例,因此您误用了autowire。似乎GraphQLService
没有其他构造函数,因此它将尝试调用该构造函数。由于您可能没有在任何地方定义String
bean,因此会出现错误。考虑定义没有ARGS构造函数或定义一个bean“代码>字符串< /代码>类型。这完全取决于你想要实现什么。您还可以从属性文件中注入此值,这实际上更有意义。此外,在本例中,由于您正在使用new
关键字创建实例,因此您误用了autowire。我可能希望以不同的方式执行此操作,因为此属性最终将是动态的,但感谢您的解释!这就解释了我做错了什么。很高兴我能帮上忙。也许试着用这个来弄清楚如何处理动态属性?我可能会想用d来做