Kak*_*adu 4 java spring nullpointerexception autowired vaadin
我正在 Vaadin 8 和 Spring 中从事简单的 bookLibrary 项目。我正在努力将服务类注入 UI 组件。它总是给我 nullPointerExceptionMessage 。我不会在任何地方使用“新”来创建服务。
这是 LibraryService 类:
@Service
public class LibraryService {
@Autowired
private BookDao bookDao;
@Autowired
private LibraryDao libraryDao;
private static LibraryService libraryServiceInstance;
private LibraryService() {
}
public static LibraryService getInstance() {
if (libraryServiceInstance == null) {
synchronized (LibraryService.class) {
if (libraryServiceInstance == null) {
libraryServiceInstance = new LibraryService();
}
}
}
return libraryServiceInstance;
}
public void saveBook(Book book) {
libraryDao.findAll().forEach(l -> l.getBooks().add(book));
book.setLibrary(libraryDao.findOne(1L));
bookDao.save(book);
}
public List<Book> getAllBooks() {
List<Book> bookList = new ArrayList<>();
libraryDao.findAll().forEach(l -> l.getBooks().forEach(b -> bookList.add(b)));
return bookList;
}
}
Run Code Online (Sandbox Code Playgroud)
GridLayout 看起来像这样:
@UIScope
@Component
public class GridLayout extends CustomComponent {
@Autowired
LibraryService libraryService; //this is null
Grid<Book> bookGrid = new Grid<>(Book.class);
VerticalLayout verticalLayout = new VerticalLayout();
public GridLayout(){
createMainLayout();
createGrid();
}
private void createMainLayout() {
setCompositionRoot(verticalLayout);
}
private void createGrid() {
bookGrid = new Grid<>(Book.class);
verticalLayout.addComponent(bookGrid);
List<Book> books = libraryService.getAllBooks();
bookGrid.setItems(books);
bookGrid.removeAllColumns();
bookGrid.addColumn(Book::getTitle).setCaption("TITLE");
bookGrid.addColumn(Book::getAuthor).setCaption("AUTHOR");
bookGrid.addColumn(Book::getYear).setCaption("YEAR");
verticalLayout.addComponent(bookGrid);
}
}
Run Code Online (Sandbox Code Playgroud)
主要 UI 代码在这里:
@SpringUI
public class LibraryUI extends UI {
@Autowired
private LibraryService libraryService;
@Autowired
private BookForm bookForm;
@Autowired
private GridLayout gridLayout;
private HorizontalLayout mainLayout;
private VerticalLayout verticalLayout = new VerticalLayout();
@Override
protected void init(VaadinRequest vaadinRequest) {
setMainLayout();
setHeader();
loadBooks();
addBookForm();
}
public void setMainLayout() {
mainLayout = new HorizontalLayout();
setContent(mainLayout);
}
public void setHeader() {
Label header = new Label("Library");
header.setStyleName(ValoTheme.LABEL_H1);
verticalLayout.addComponent(header);
mainLayout.addComponent(verticalLayout);
verticalLayout.setComponentAlignment(header, Alignment.TOP_CENTER);
header.addStyleName(ValoTheme.LABEL_H1);
}
private void loadBooks(){
mainLayout.addComponent(gridLayout);
}
public void addBookForm() {
mainLayout.addComponent(bookForm);
mainLayout.setComponentAlignment(bookForm, Alignment.MIDDLE_CENTER);
}
Run Code Online (Sandbox Code Playgroud)
我将非常感谢任何帮助或想法出了什么问题。
问题是您从 GridLayout 构造函数调用 createGrid() ,@Autowire 在调用构造函数后注入 bean,所以您需要做的是这样的
public GridLayout(){
}
@PostConstruct
public init(){
createMainLayout();
createGrid();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1640 次 |
| 最近记录: |