lombok @RequiredArgsConstructor как ввести значение в конструктор весенней загрузки

У меня есть класс с ломбоком @RequiredArgsConstructor:

@RequiredArgsConstructor
@Service
public class Test{

private final String str;
private String str5;

// more code

}

При загрузке без Spring мы предоставляем в xml как:

<bean id="Test" class="com.abc.Test">
        <constructor-arg index="0" value="${xyz}"/>
    </bean>

как добиться того же из весенней загрузки можно через application.properties, но как ввести


person Techno    schedule 12.08.2020    source источник
comment
Это помогает? stackoverflow.com/questions/37671467/ и, если хотите чтобы ввести уже доступные бобы в контексте Spring, например любой репозиторий, просто сделавший их окончательными, внедрит их. private final SomeRepository repository   -  person Sujitmohanty30    schedule 12.08.2020
comment
В этом случае он не компилируется. В моем случае это дает ошибку: Параметр 0 конструктора в com.abc.Test требует bean-компонента типа java.lang.String, который не может быть найден.   -  person Techno    schedule 12.08.2020
comment
вы аннотировали переменную String как @NonNull?   -  person Sujitmohanty30    schedule 12.08.2020
comment
Не добавляйте для этого Ломбок. Он ожидает строкового bean-компонента, а не значения, которое будет введено из свойств. Используйте @Value("${xyz"}) в параметре конструктора. Вы можете использовать ломбок, но применение аннотаций к конструктору становится действительно беспорядочным. См. onConstructor документацию,   -  person Darren Forsythe    schedule 12.08.2020


Ответы (2)


Аннотацию @Service необходимо удалить, а компонент должен быть создан в @Configuration классе с @Bean аннотированным методом, возвращающим этот тип класса.

//Test.java
package com.abc;

import lombok.RequiredArgsConstructor;
import lombok.ToString;

@RequiredArgsConstructor
@ToString
public class Test {

private final String str;
private String str5;

}
//DemoApplication.java
package com.abc;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {

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

    @Bean
    Test buildTest(@Value("${xyz}") String value) {
        return new Test(value);
    }

}

примечание: @SpringBootApplication подразумевает @Configuration

//DemoApplicationTests.java
package com.abc;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    com.abc.Test test;

    @Test
    void contextLoads() {
        System.out.println(test);
    }

}
#application.properties
xyz=print me

Результат:

Test(str=print me, str5=null)
person Lennonry    schedule 27.08.2020

В этом случае я думаю, вам лучше либо аннотировать поле:

@Service
public class Test{

    @Value("${xyz}")
    private String str;

    private String str5;

    // more code
}

или явно определяя конструктор с аннотированным параметром:

@Service
public class Test{

    private final String str;

    private String str5;

    public Test(@Value("${xyz}") String str) {
        this.str = str;
    }
    // more code
}

И если у вас есть другие поля final, вы можете комбинировать создание конструктора lombok с аннотацией полей, как указано в Лучшая практика для @ Поля значений, ломбок и внедрение конструктора?

@RequiredArgsConstructor
@Service
public class Test{

    @Value("${xyz}")
    private String str;

    private final String str5;

    // more code
}
person Fede Garcia    schedule 29.10.2020