java - 如何在应用程序类中定义一个bean

标签 java spring javabeans

我正在尝试一些如此简单但...

所以我有一个应用程序类:

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@SpringBootApplication
@Configuration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public Counter getCounter() {
        return new Counter(10);
    }
}

还有一个简单的 Counter 类:

package hello;

public class Counter {
    private int counter = 0;

    public Counter(int c) {
        counter = c;
    }

    public int getNext() {
        return ++counter;
    }
}

还有一个 REST Controller :

package hello;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    @RequestMapping("/count")
    public ResponseEntity greeting(Counter counter) {
        return ResponseEntity.ok(counter.getNext());
    }
}

当我发送请求时,出现以下异常:

java.lang.NoSuchMethodException: hello.Counter.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_131]
    at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_131]
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:102) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:141) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:101) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
....

在我看来,Spring 无法识别 Bean 定义,但我不确定。有谁知道我错过了什么?

最佳答案

问题是您将 Counter 作为参数 传递给您的 Controller 方法。方法参数用于传递特定于该请求的信息(路径组件、查询参数、 header ),而 Spring 通过创建类的实例(在本例中为 Counter)并设置它来处理通用 POJO 参数来自 HTTP 请求的参数,而不是使用 beans。

相反,您希望计数器属于 Controller 本身(而不是特定请求):

@RestController
public class GreetingController {

    private final Counter counter;

    public GreetingController(Counter c) {
        this.counter = c;
    }

    @RequestMapping("/count")
    public ResponseEntity greeting() {
        return ResponseEntity.ok(counter.getNext());
    }
}

另请注意,如果每个可用的构造函数都将值设置为其他值,则最好不要将计数器变量初始化为零,因为对于阅读您的代码的人来说,该值已明确设置在某处会更清楚一些。

关于java - 如何在应用程序类中定义一个bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44709503/

相关文章:

spring - 无法连接到 10.XX.XX.28 :6379: Unknown error - while accessing from Spring Batch or windows machine 处的 Redis

java - 应用程序配置,Bean 到 xml

java - 扫描仪正则表达式分隔符问题

java - HikariDataSource.getConnection() 在低流量时缓慢,在大流量时快速

spring - 如何强制 Spring Boot 重定向到 https 而不是 http?

json - spring序列化 Autowiring 字段

java spring bean注册

javascript - 从 JavaScript + JSF 调用 Backing bean 方法

java - 打印 XMLUnit 中所有差异的惯用方式是什么?

java - 无法解析 fragment 中的方法 'findViewById(Int)'