我的Playframework项目出现错误,说该课程的位置与其内容不匹配

时间:2018-11-30 02:09:08

标签: java scala playframework

嗨,我是PlayFramework的新手,我正在做一个在线学习书店的教程。我不断收到一个编译错误,指出该类的位置与其内容不匹配。我在下面包括了我的代码。

Book.java(模型类)

 package Models;

    import java.util.HashSet;
    import java.util.Set;

    public class Book {

        public Integer id;
        public String title;
        public double price;
        public String author;
        private static Set<Book> books;

        public Book(){

        }

        public Book(Integer id, String title, double price, String author) {
            this.id = id;
            this.title = title;
            this.price = price;
            this.author = author;
        }

        static {
            books=new HashSet<>();
            books.add(new Book(1,"C++",20,"Mehani"));
            books.add(new Book(2,"Java",30,"Anju"));
        }

        public static Set<Book> allBooks(){
            return books;
        }

        public static Book fineById(Integer id){
            for (Book book:books){
                if (id.equals(book.id)){
                    return book;
                }
            }
            return null;
        }

        public static void add(Book book){
            books.add(book);
        }

        public static boolean remove(Book book){
            return books.remove(book);
        }
    }

BookController

 package controllers;

    import Models.Book;
    import play.data.Form;
    import play.filters.cors.CORSFilter;
    import play.filters.csrf.CSRFFilter;
    import play.filters.headers.SecurityHeadersFilter;
    import play.mvc.Controller;
    import play.mvc.Result;
    import javax.inject.Inject;
    import play.data.FormFactory;
    import views.html.Books.*;


    import java.util.Set;

    public class BookController extends Controller {

        @Inject
        FormFactory formFactory;

        @Inject
        CSRFFilter csrfFilter;
        @Inject
        CORSFilter corsFilter;
        @Inject
        SecurityHeadersFilter secHeaders;
        //for all books
        public Result index(){
            Set<Book> books= Book.allBooks();
            return ok(index.render(books));
        }

        //to add a book
        public Result create(){
            Form<Book> bookForm=formFactory.form(Book.class);
            return ok(create.render(bookForm));
        }

        //to save a book

        public Result save(){
            Form<Book> bookForm= formFactory.form(Book.class).bindFromRequest();
            Book book = bookForm.get();
            Book.add(book);
            return redirect(routes.BookController.index());
        }

        public Result edit(Integer id){
            return TODO;
        }

        public Result update(){
            return TODO;
        }

        public Result destroy(Integer id){
            return TODO;
        }

        public Result show(Integer id){
            return TODO;
        }
    }

路线

 # Routes
    # This file defines all application routes (Higher priority routes first)
    # ~~~~

    # An example controller showing a sample home page
    GET     /                           controllers.HomeController.index




    GET     /books                            controllers.BookController.index()
    GET     /books/create                    controllers.BookController.create()
    GET     /books/:id                       controllers.BookController.show(id: Integer)
    GET     /books/edit/:id                  controllers.BookController.edit(id: Integer)

    +nocsrf
    POST    /books/edit                      controllers.BookController.update()
    +nocsrf
    POST    /books/create                      controllers.BookController.save()
    GET     /books/destroy/:id         controllers.BookController.destroy(id: Integer)
    # Map static resources from the /public folder to the /assets URL path
    GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)

这是我的index.scala.html视图。 (变量为红色,表示找不到符号)

@import Models.Book

@(books : Set[Book])

<html>
    <head>
        <title>All books</title>
    </head>

    <body>
        <h1>All Books</h1>

        @for(book <- books){

            <a href="#">@book.title</a>
            <p>Price: @book.price</p>
            <p>Author: @book.author</p>
        }

    </body>
</html>

这是我得到的编译错误。

[info] Compiling 1 Scala source and 1 Java source to J:\myfirstapp\target\scala-2.12\classes ...
[error] error while loading Book, class file 'J:\myfirstapp\target\scala-2.12\classes\models\Book.class' has location not matching its contents: contains class Book
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] application - 

! @7a4gfkgn9 - Internal server error, for (GET) [/] ->

play.sbt.PlayExceptions$CompilationException: Compilation error[error while loading Book, class file 'J:\myfirstapp\target\scala-2.12\classes\models\Book.class' has location not matching its contents: contains class Book]
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:34)
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:34)
    at scala.Option.map(Option.scala:146)
    at play.sbt.run.PlayReload$.$anonfun$taskFailureHandler$1(PlayReload.scala:33)
    at scala.Option.map(Option.scala:146)
    at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:28)
    at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:24)
    at play.sbt.run.PlayReload$.$anonfun$compile$3(PlayReload.scala:51)
    at scala.util.Either$LeftProjection.map(Either.scala:573)
    at play.sbt.run.PlayReload$.compile(PlayReload.scala:51)

我在尝试实现save()之后得到了这个。

项目的结构

myfirstapp
.g8
.gradle
.idea
app
controllers
Modles
Book
views
Books
home
index.scala.html
main.scala.html
conf
gradle
logs
project
public
target
test
build.gradle
build.sbt
gradlew
gradlew.bat
myfirstapp.iml

如何解决此编译错误?

1 个答案:

答案 0 :(得分:0)

我最好的选择是,您可能会想不到与Windows不同,Java和Scala区分大小写。因此路径models\Book.class与软件包名称package Models;不匹配。实际上,在Java / Scala世界中,习惯上以小写字母命名您的软件包。尝试将Book.java的代码更改为package models;。这可能会为您解决问题。