Я создаю веб-интерфейс с помощью Vaadin, который отображает список объектов, которые есть в моем корзине Amazon S3, в компоненте Vaadin Grid. Моя служба работает нормально, но я получаю исключение NullPointerException каждый раз, когда пытаюсь добавить список объектов из моей службы S3 в сетку.
Вот сервис S3: Сервис S3
Я протестировал свой сервис, используя интерфейс Spring CommandLineRunner в тестовом классе. Вот тестовый класс: Тестовый класс
Всякий раз, когда я запускаю приложение, я вижу список элементов в моем сегменте S3, указанный на консоли: Вывод на консоль
Но та же служба выдает исключение NullPointerException в браузере всякий раз, когда я пытаюсь добавить элементы списка в сетку Vaadin, и исключение BeanCreationException регистрируется на консоли:
BeanCreationExceptionNullPointerException
Вот S3Service.java
@Service
public class S3Service {
@Autowired
private AmazonS3 s3Client;
@Value("${aws.s3.bucket.name}")
private String bucketName;
public List<String> listObjects() {
ObjectListing objectListing=s3Client.listObjects(bucketName);
return objectListing.getObjectSummaries()
.stream()
.map(S3ObjectSummary::getKey)
.collect(Collectors.toList());
}
}
TestFeatureClass.java
@Component
public class TestFeatureClass implements CommandLineRunner {
@Autowired
private S3Service s3Service;
@Override
public void run(String... args) throws Exception {
System.out.println(s3Service.listObjects());
}
}
DocumentManagementSystemView.java
@PageTitle("Documents")
@Route(value = "api/v1/files/list",layout = MainLayout.class)
@Uses(Icon.class)
public class DocumentManagementSystemView extends VerticalLayout {
@Autowired
public S3Service s3Service;
Grid<String> grid;
public DocumentManagementSystemView() {
this.grid=new Grid<>(String.class,false);
configureGrid();
add(grid);
updateList();
}
private void configureGrid() {
grid.setColumns("Filename");
}
private void updateList() {
grid.setItems(s3Service.listObjects());
}
}
Понял. Буду иметь это в виду в следующий раз.




Первая проблема, которую я вижу, заключается в том, что вам следует использовать внедрение в конструктор вместо внедрения в поле, если вы собираетесь использовать внедренный компонент во время конструктора. Это должно исправить ваше исключение NullPointerException.
@PageTitle("Documents")
@Route(value = "api/v1/files/list",layout = MainLayout.class)
@Uses(Icon.class)
public class DocumentManagementSystemView extends VerticalLayout {
private S3Service s3Service;
private Grid<String> grid;
public DocumentManagementSystemView(S3Service s3Service) {
this.s3Service = s3Service;
...
}
}
Вторая проблема, которую я вижу, заключается в том, что вы используете grid.setColumns("Filename") в сетке типа String. При этом будет предпринята попытка найти свойство под названием «Имя файла» в классе String и отобразить его в столбце. Я предполагаю, что вам нужен столбец с заголовком «Имя файла». Поскольку Grid имеет тип String, и вы хотите отобразить эту строку в этом столбце, вам следует предоставить поставщик значений, который возвращает весь элемент/строку: str -> str или Function.identity(), по сути, это одно и то же, вы выбираете, что вам более удобочитаемо. . подробнее
grid.addColumn(str -> str).setHeader("Filename");