Как я могу использовать абстрактный класс в Spring Framework? - PullRequest
1 голос
/ 13 мая 2019

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

Description:

Parameter 0 of constructor in com.in28minutes.spring.practice.springmasterclasspractice.devicefactory.LaptopManufacturingProcess required a bean of type 'java.lang.String' that could not be found.

Action:
Consider defining a bean of type 'java.lang.String' in your configuration.

Не могли бы вы, ребята, дать мне совет, как я могу решить эту ошибку?

Spring Boot: v2.1.4 Java: 10.0.2 Maven: 3,6,0

SpringMasterClassPracticeDeviceFactoryApplication класс

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringMasterClassPracticeDeviceFactoryApplication {

    private static Logger LOGGER = LoggerFactory.getLogger(SpringMasterClassPracticeDeviceFactoryApplication.class);

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication
                .run(SpringMasterClassPracticeDeviceFactoryApplication.class, args);
        ManufacturingImpl manufacturingImpl = applicationContext.getBean(ManufacturingImpl.class);

        System.out.println(manufacturingImpl);
        // manufacturingImpl.manifactureProduct("Laptop Process");

        LOGGER.info("{}", manufacturingImpl);

    }

}

ManufacturingImpl класс

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class ManufacturingImpl {

    @Autowired
    @Qualifier("laptop")
    private GeneralManufacturingProcess generalManufacturingProcess;

    public void manifactureProduct(String processName) {
        System.out.println(generalManufacturingProcess);
        generalManufacturingProcess.launchProcess();
    }
}

GeneralManufacturingProcess класс

public abstract class GeneralManufacturingProcess {

    private String processName;

    public GeneralManufacturingProcess(String processName) {
        this.processName = processName;
    }

    public String getProcessName() {
        return processName;
    }

    public void launchProcess() {
        if (processName != null && !processName.isEmpty()) {
            assembleDevice();
            testDevice();
            packageDevice();
            storeDevice();
        } else {
            System.out.println("No process name was specified");
        }
    }

    protected abstract void assembleDevice();

    protected abstract void testDevice();

    protected abstract void packageDevice();

    protected abstract void storeDevice();
}

LaptopManufacturingProcess класс

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
@Qualifier("laptop")
public class LaptopManufacturingProcess extends GeneralManufacturingProcess {

    public LaptopManufacturingProcess(String processName) {
        super(processName);
    }

    @Override
    protected void assembleDevice() {
        System.out.println("Assembled laptop: " + getProcessName());
    }

    @Override
    protected void testDevice() {
        System.out.println("Tested laptop: " + getProcessName());
    }

    @Override
    protected void packageDevice() {
        System.out.println("Packaged laptop: " + getProcessName());
    }

    @Override
    protected void storeDevice() {
        System.out.println("Stored laptop: " + getProcessName());
    }
}

1 Ответ

1 голос
/ 13 мая 2019

Есть несколько способов решить эту проблему.Проблема в том, что Spring Framework пытается создать экземпляр LaptopManufacturingProcess с одним конструктором, который принимает строку.Таким образом, Framework пытается автоматически связать Bean типа String в конструктор, который просто не работает.По сути, вы можете сделать следующее:

  • создать конструктор без аргументов и передать ему жестко закодированную строку родительскому конструктору:
public LaptopManufacturingProcess() {
  super("String");
}
  • Добавление аннотации @ Value для чтения строки из PropertySource:
public LaptopManufacturingProcess(@Value("${property.key.here}") String processName) {
  super(processName);
}
  • Создание фабричного компонента для создания экземпляров GeneralManufacturingProcess по требованию
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...