Pois bem, tudo começa pelo formulário:
<h:form enctype="multipart/form-data">
<div class="form-group">
<h:outputLabel value="Título" for="titulo" />
<h:inputText value="#{adminLivrosBean.livro.titulo}" required="true"
id="titulo" styleClass="form-control" />
<h:message for="titulo" />
</div>
<div class="form-group">
<h:outputLabel value="Descrição" for="descricao" />
<h:inputTextarea rows="4" cols="20" required="true"
value="#{adminLivrosBean.livro.descricao}" id="descricao"
styleClass="form-control" />
<h:message for="descricao" />
</div>
<div class="form-group">
<h:outputLabel value="Número de Páginas" for="numeroPaginas" />
<h:inputText value="#{adminLivrosBean.livro.numeroPaginas}"
required="true" id="numeroPaginas" styleClass="form-control" />
<h:message for="numeroPaginas" />
</div>
<div class="form-group">
<h:outputLabel value="Preço" for="preco" />
<h:inputText value="#{adminLivrosBean.livro.preco}" required="true"
id="preco" styleClass="form-control" />
<h:message for="preco" />
</div>
<div class="form-group">
<h:outputLabel value="Autores" for="autores" />
<h:selectManyListbox value="#{adminLivrosBean.livro.autores}"
converter="autorConverter" id="autores" styleClass="form-control">
<f:selectItems value="#{adminLivrosBean.autores}" var="autor"
itemValue="#{autor}" itemLabel="#{autor.nome}" />
</h:selectManyListbox>
<h:message for="autores" />
</div>
<div class="form-group">
<h:outputLabel value="Data de Publicação" />
<h:inputText value="#{adminLivrosBean.livro.dataPublicacao}"
id="dataPublicacao" styleClass="form-control" />
<h:message for="dataPublicacao" />
</div>
<div class="form-group">
<h:outputLabel value="Capa do Livro" />
<h:inputFile value="#{adminLivrosBean.capaLivro}" id="capaLivro"
styleClass="form-control" />
</div>
<h:commandButton value="Cadastrar" action="#{adminLivrosBean.salvar}"
styleClass="btn btn-primary" />
</h:form>
O bean responsável pelo recebimento das informações para a persistência do livro:
@Named
@RequestScoped
public class AdminLivrosBean {
private Livro livro = new Livro();
@Inject
private LivroDao dao;
@Inject
private AutorDao autorDao;
@Inject
private FacesContext context;
private Part capaLivro;
@Transactional
public String salvar() {
FileSaver fileSaver = new FileSaver();
String capaPath = fileSaver.write(capaLivro, "livros");
livro.setCapaPath(capaPath);
dao.salvar(livro);
context.getExternalContext()
.getFlash().setKeepMessages(true);
context
.addMessage(null, new FacesMessage("Livro cadastrado com sucesso!"));
return "/livros/lista?faces-redirect=true";
}
public List<Autor> getAutores() {
return autorDao.listar();
}
public Livro getLivro() {
return livro;
}
public void setLivro(Livro livro) {
this.livro = livro;
}
public Part getCapaLivro() {
return capaLivro;
}
public void setCapaLivro(Part capaLivro) {
this.capaLivro = capaLivro;
}
}
A classe para salvar a foto quando recebo no form:
public class FileSaver {
public static final String SERVER_PATH = "/casadocodigo";
public String write(Part arquivo, String path) {
String relativePath = path + "/" + arquivo.getSubmittedFileName();
String fullPath = SERVER_PATH + "/" + relativePath;
try {
arquivo.write(fullPath);
} catch (IOException e) {
throw new RuntimeException(e);
}
return relativePath;
}
public static void transfer(Path source, OutputStream outputStream) {
try {
FileInputStream input = new FileInputStream(source.toFile());
try( ReadableByteChannel inputChannel = Channels.newChannel(input);
WritableByteChannel outputChannel = Channels.newChannel(outputStream)) {
ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 10);
while(inputChannel.read(buffer) != -1) {
buffer.flip();
outputChannel.write(buffer);
buffer.clear();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
}
Durante o curso, é pedido para criar uma pasta "C:\casadocodigo\livros", é lá que será salvo as imagens vindas do formulário, e também onde o método que lista os livros vai buscar as imagens de cada livro.
Porém, ao tentar cadastrar um livro, ele tenta salvar no seguinte diretório:
C:\Dev\Server\glassfish4\glassfish\domains\domain1\generated\jsp\casadocodigo\casadocodigo\livros
Como o diretório não existe, ele da erro.