Поле требует бин типа, который не может быть найден - PullRequest
0 голосов
/ 27 марта 2020

Я учащийся в весенней загрузке, поэтому я пытался создать основы для начальной загрузки. Я получил ошибку при попытке запустить разработанное приложение.

Я получил ошибку [! [https://i.stack.imgur.com/oyQDi.png] [1]] [1]

StoreApiAPP. java:

package io.ajithan.springbootstarter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({"io.ajithan.springbootstarter"})
public class StoreApiAPP {

    public static void main(String[] args) {
        SpringApplication.run(StoreApiAPP.class, args);

    }

}

ItemDetails. java: [имя пакета: io.ajithan.springbootstarter.model]

package io.ajithan.springbootstarter.model;


public class ItemDetails {
    private Integer itemId;
    private String itemName;
    private Double itemPrice;
    private String itemCategory;

    public ItemDetails() {

    }

    public ItemDetails(Integer itemId, String itemName, Double itemPrice, String itemCategory) {
        this.itemId = itemId;
        this.itemName = itemName;
        this.itemPrice = itemPrice;
        this.itemCategory = itemCategory;
    }


    public Integer getItemId() {
        return itemId;
    }
    public void setItemId(Integer itemId) {
        this.itemId = itemId;
    }
    public String getItemName() {
        return itemName;
    }
    public void setItemName(String itemName) {
        this.itemName = itemName;
    }
    public Double getItemPrice() {
        return itemPrice;
    }
    public void setItemPrice(Double itemPrice) {
        this.itemPrice = itemPrice;
    }
    public String getItemCategory() {
        return itemCategory;
    }
    public void setItemCategory(String itemCategory) {
        this.itemCategory = itemCategory;
    }

}

ItemResponse. java: [имя пакета: io.ajithan.springbootstarter.model]

package io.ajithan.springbootstarter.model;

public class ItemResponse {
public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

private String message;
}

StoreController. java: [имя пакета: io.ajithan.springbootstarter.controller]

package io.ajithan.springbootstarter.controller;


import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import io.ajithan.springbootstarter.model.ItemDetails;
import io.ajithan.springbootstarter.model.ItemResponse;
import io.ajithan.springbootstarter.service.StoreService;

@RestController
public class StoreController {
    @Autowired
    private StoreService storeService; 

    @RequestMapping("/getAllItems")
    public List<ItemDetails> getItemDetailsList(){
        return storeService.getItemDetails();
    }

    @RequestMapping("/getSingleItem/{idNumber}")
    public ItemDetails getSingleItem(@PathVariable("idNumber") Integer id) {
        return storeService.getSingleItem(id);
    }

    @RequestMapping(method=RequestMethod.POST,value="/addItem")
    public ItemResponse addSingleItem(@RequestBody ItemDetails itemDetails) {
        return storeService.addSingleItem(itemDetails);
    }


}

StoreService. java: [имя пакета: io.ajithan.springbootstarter.service]

package io.ajithan.springbootstarter.service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import io.ajithan.springbootstarter.model.ItemDetails;
import io.ajithan.springbootstarter.model.ItemResponse;

@Service
public class StoreService {

    @Autowired
    private ItemResponse itemResponse;

    private List<ItemDetails> itemDetailsList = new ArrayList<>(Arrays.asList(
            new ItemDetails(1,"5Rs GOODDAY Biscuit",5.00,"SWEET"),
            new ItemDetails(2,"10Rs GOODAY Biscuit,",10.00,"SALTY"),
            new ItemDetails(3,"25Rs GOODAY Biscuit",25.00,"CREAMY")
            ));
    public List<ItemDetails> getItemDetails()
    {
        return itemDetailsList;
    }
    public ItemDetails getSingleItem(Integer id) {
        return itemDetailsList.stream().filter(n->n.getItemId().equals(id)).findFirst().get();
    }

    public ItemResponse addSingleItem(ItemDetails itemDetails) {
        itemDetailsList.add(itemDetails);
        itemResponse.setMessage("Item added successfully");
        return itemResponse;
    }

}

Может кто-нибудь дать мне решение этой проблемы?

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Нет никакого смысла и в этом случае действительно опасно, для автоматического подключения ItemResponse.

По умолчанию bean-компоненты в Spring являются синглетонами, так что теперь есть один экземпляр ItemResponse. Теперь представьте 50 одновременных потоков, изменяющих один экземпляр ItemResponse. Как вы думаете, какой вывод будет иметь каждый поток?

В вашем случае единственное правильное решение - удалить поле с автопроводкой, просто создать новый ItemResponse внутри метода addSingleItem и вернуть его. Таким образом, нет общего состояния.

@Service
public class StoreService {

    private List<ItemDetails> itemDetailsList = new ArrayList<>(Arrays.asList(
            new ItemDetails(1,"5Rs GOODDAY Biscuit",5.00,"SWEET"),
            new ItemDetails(2,"10Rs GOODAY Biscuit,",10.00,"SALTY"),
            new ItemDetails(3,"25Rs GOODAY Biscuit",25.00,"CREAMY")
            ));

    public List<ItemDetails> getItemDetails()
    {
        return itemDetailsList;
    }
    public ItemDetails getSingleItem(Integer id) {
        return itemDetailsList.stream().filter(n->n.getItemId().equals(id)).findFirst().get();
    }

    public ItemResponse addSingleItem(ItemDetails itemDetails) {
        itemDetailsList.add(itemDetails);
        ItemResponse itemResponse = new ItemResponse();
        itemResponse.setMessage("Item added successfully");
        return itemResponse;
    }
}
0 голосов
/ 27 марта 2020

Вы должны определить компонент ItemResponse в своем приложении:

Начните с добавления нотации @ Component в классе ItemResponse следующим образом:

@Component
public class ItemResponse {
    private String message;

    //** Default Constructor 
    public ItemResponse() {
    }

    //** getter and setter
}

И в где-то в конфигурации класса вы должны сказать Spring, что ItemResponse - это bean-компонент, который нужно будет внедрить. Если у вас есть класс с нотацией @ Configuration , объявите свой компонент, иначе создайте класс конфигурации, например, в пакете с именем «config»:

@Configuration
public class AppConfig {

    @Bean
    public ItemResponse itemResponse() {
        return new ItemResponse() ;
    }

}

И не забудьте поставить конструктор по умолчанию в вашем бине. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...