英文:
How to get exchange rate json information using by application.properties with REST service?
问题
我想从 'https://dovizkurlari-l6vtviaacq-uc.a.run.app/api/doviz/usd' 获取 JSON 数据,并通过一个服务来展示它,但我遇到了一个无法解决的错误。
我在 application.properties 文件中添加了以下属性:
application.properties
tcmb.request.dolar=https://dovizkurlari-l6vtviaacq-uc.a.run.app/api/doviz/usd
然后我在 tcmbCommon 类中将这个链接赋值给变量 dolarUrl。
tcmbCommon.java
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class TcmbCommon {
    @Value("${tcmb.request.dolar}")
    public String dolarUrl;
}
在一个服务类中,我使用 restTemplate 获取了这个服务的值。
DollarService.java
@Service
@RequiredArgsConstructor
@PropertySource("classpath:application.properties")
public class DolarService {
    @Autowired
    TcmbCommon tcmbCommon;
    public String getDolar(){
        RestTemplate rest = new RestTemplate();
        String data = rest.getForObject(tcmbCommon.getDolarUrl(), String.class);
        return data;
    }
}
最后,我通过在 DolarController 类中调用 DolarService 类来创建一个响应服务。
DolarController.java
@RestController
@RequestMapping(value = "/api/dolar")
@RequiredArgsConstructor
@Log4j2
public class DolarController {
    private @NonNull final DolarService dolarService;
    @GetMapping("/getDolar")
    public ResponseEntity<?> getDolar(){
        return new ResponseEntity<>(dolarService.getDolar(), HttpStatus.OK);
    }
}
当启动项目时,我遇到了这个错误。
***************************
应用启动失败
***************************
描述:
在 com.tcmb.webservices.tcmbwebservices.controller.DolarController 中的构造函数的参数 0 需要一个类型为 'com.tcmb.webservices.tcmbwebservices.services.DolarService' 的 bean,但找不到该类型的 bean。
操作:
考虑在配置中定义一个类型为 'com.tcmb.webservices.tcmbwebservices.services.DolarService' 的 bean。
英文:
I want to take the json data in the 'https://dovizkurlari-l6vtviaacq-uc.a.run.app/api/doviz/usd' and present it with a service. but I got an error I can't solve.
I added the below property in my application.properties
application.properties
tcmb.request.dolar=https://dovizkurlari-l6vtviaacq-uc.a.run.app/api/doviz/usd
Then I assign this link to the variable dolarUrl in tcmbCommon class.
tcmbCommon.java
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class TcmbCommon {
    @Value("${tcmb.request.dolar}")
    public String dolarUrl;
    }
and in a service class, I got the values for this service with restTemplate
DollarService.java
@Service
@RequiredArgsConstructor
@PropertySource("classpath:application.properties")
public class DolarService {
    @Autowired
    TcmbCommon tcmbCommon;
    public String getDolar(){
        RestTemplate rest = new RestTemplate();
        String data = rest.getForObject(tcmbCommon.getDolarUrl(), String.class);
        return data;
    }
}
finally I created an response service by calling the DolarService class in the DolarController class
DolarController.java
@RestController
@RequestMapping(value = "/api/dolar")
@RequiredArgsConstructor
@Log4j2
public class DolarController {
    private @NonNull
    final DolarService dolarService;
    @GetMapping("/getDolar")
    public ResponseEntity<?> sDolar(){
        return new ResponseEntity<>(dolarService.getDolar(), HttpStatus.OK);
    }
}
I get this error when starting the project.
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in com.tcmb.webservices.tcmbwebservices.controller.DolarController required a bean of type 'com.tcmb.webservices.tcmbwebservices.services.DolarService' that could not be found.
Action:
Consider defining a bean of type 'com.tcmb.webservices.tcmbwebservices.services.DolarService' in your configuration.
Disconnected from the target VM, address: '127.0.0.1:63388', transport: 'socket'
答案1
得分: 1
你错过了在控制器类中写 @Autowired。
**@Autowired
final DolarService dolarService;**
然后尝试运行。
英文:
you missed to write @Autowired in controller class.
**@Autowired
final DolarService dolarService;**
then try to run.
答案2
得分: 1
请在注入依赖项到DollarService bean时,修改DolarController.java文件如下所示。我猜想在字段上既使用@Autowired又使用final关键字是矛盾的。
@Autowired       // 这将注入DollarService类的依赖项(自动装配)
private DolarService dolarService;
如果您想要在字段上使用final关键字进行自动装配,您需要按照以下方式进行构造函数注入。
@Autowired
public DolarController(DolarService dolarService) {
    this.dolarService = dolarService;
}
请告诉我是否问题已解决。
英文:
Please modify DolarController.java with below code while injecting dependencies to DollarService bean. I guess having @Autowired and final on a field are contradictory.
@Autowired       // this will inject the dependency of DollarService class (autowiring)
private DolarService dolarService;
If you want to use the final keyword autowired, you need to do constructor injection as mentioned below.
@Autowired
public DolarController(DolarService dolarService) {
    this.dolarService = dolarService;
}
Please let me know if it is still not resolved.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论