com.project.api.graphql.service.GraphQLService中构造函数的参数0需要类型为';java.lang.String';那是找不到的

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.

我是Spring Boot新手,我想知道这个错误消息

我正在尝试创建一个GraphQL类来连接到各种GraphQL配置,并希望将一个值传递给构造函数(最终用于我的类路径):

我正在使用一个如何将GraphQL连接到Spring Boot的示例,我有几个地方使用了注释@Autowired以及@PostConstruct。我觉得其中一个问题正导致我所看到的问题

完全错误如下所示:

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来做