Springboot:Localhost:8080导致Whitepage-Error而不是显示内容

时间:2018-07-25 14:04:17

标签: java spring-boot intellij-idea localhost thymeleaf

我正在尝试使用Springboot和Thymeleaf显示基因列表。数据库(基因,蛋白质等)和所有方法(例如基因的getIdentifier)都可以使用。 项目结构为:

enter image description here

我的类/ html文件是:

主要:

package main;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan
@EnableAutoConfiguration
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

ApplicationController:

package gui.spring.controller;

import db.admin.DatabaseQuery;
import db.admin.local.DatabaseQueryLocal;
import db.io.FileReader;
import db.sample.Gene;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

@SpringBootApplication
@Controller
public class ApplicationController {
    @RequestMapping(value = "/", method=RequestMethod.GET)
    public String root(Model model){
        DatabaseQuery query = new DatabaseQueryLocal();
        new FileReader(query);

        List<Gene> genes = query.getGenes();
        model.addAttribute("genes", genes);
        return "root";
    }

}

root.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <th:block th:each="gene:${genes} ">
        <p th:text="${gene.getIdentifier()}"></p>
    </th:block>


</body>
</html>

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>1.0.0</modelVersion>

    <groupId>SpringBoot</groupId>
    <artifactId>biosampledb</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <type>jar</type>
        </dependency>

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>1.4.6.RELEASE</version>
      </dependency>

      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.7</version>
      </dependency>

    </dependencies>
</project>

因此,我们已经在课程中进行了此操作,可悲的是,没有对Springboot / Thymeleaf / Maven进行任何解释。我想大部分都弄明白了。我想要的所需结果是,在浏览器中调用“ localhost:8080”后,将显示一个基因标识符列表。运行主atm时,出现白色标签错误页面。 我希望这是解决我的问题所需的全部代码。我监督/错过了什么?

谢谢:)

更新:新项目结构

enter image description here

UPDATE2:DatabaseQuery和DatabaseQueryLocal

这是DatabaseQuery接口(已提供)。

package db.admin;

import db.sample.Assay;
import db.sample.Gene;
import db.sample.Protein;
import org.apache.commons.lang3.*;

import java.util.List;
import java.util.Optional;

public interface DatabaseQuery {
    List<Assay> getAssays();

    List<Gene> getGenes();

    List<Protein> getProteins();

    void addAssay(Assay assay);

    void addGene(Gene gene);

    void addProtein(Protein protein);

    /**
     * Returns all Assays that used a Protein that is associated with the given gene.
     *
     * @param gene - gene to get the proteins
     *
     * @return list of associated assays
     */
    List<Assay> getAssaysByGene(Gene gene);

    /**
     * Returns all Proteins that have a measurement above or equal to 'meas' in any Assay
     *
     * @param meas - threshold value
     * @return A list of tuples (Pairs) where the Protein is left and the measured score from the assay is right
     */
    List<Pair<Protein, Double>> getAssayResultsByMeas(Double meas);

    /**
     * Return all Scores and assoc. Assays for a given Protein
     *
     * @param protein - protein to look up
     * @return List of Pairs of assays and results for the given protein on that assay
     */
    List<Pair<Assay, Double>> getScores(Protein protein);

    /**
     * Returns a protein by given identifier. Returns Optinal.empty if there is no protein with this name
     *
     * @param identifier - id of the protein
     * @return Optional protein
     */
    Optional<Protein> getProteinByName(String identifier);

    /**
     * Returns a gene by given identifier. Returns Optinal.empty if there is no gene with this name
     *
     * @param name - id  of a gene
     * @return Optional protein
     */
    Optional<Gene> getGeneByName(String name);

    /**
     * Returns a assay by given identifier. Returns Optinal.empty if there is no assay with this name
     *
     * @param name - id  of a gene
     * @return Optional protein
     */
    Optional<Assay> getAssayByName(String name);
}

DatabaseQueryLocal类:

package db.admin.local;

import db.admin.DatabaseQuery;
import db.sample.Assay;
import db.sample.Gene;
import db.sample.Protein;
import org.apache.commons.lang3.*;
import org.apache.commons.lang3.tuple.ImmutablePair;
//import org.apache.commons.lang3.tuple.ImmutablePair;
//import org.apache.commons.lang3.tuple.Pair;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class DatabaseQueryLocal implements DatabaseQuery {
    private final DatabaseLocal db;

    public DatabaseQueryLocal() {
        this.db = DatabaseLocal.getInstance();
    }

    @Override
    public List<Assay> getAssays(){
        return db.assayList;
    }

    @Override
    public List<Gene> getGenes(){
        return db.geneList;
    }

    @Override
    public List<Protein> getProteins(){
        return db.proteinList;
    }


    @Override
    public void addAssay(Assay assay){
        db.assayList.add(assay);
    }

    @Override
    public void addGene(Gene gene){
        db.geneList.add(gene);
    }

    @Override
    public void addProtein(Protein protein){
        db.proteinList.add(protein);
    }


    /**
     * Returns all Assays that used a Protein that is associated with the given gene.
     *
     * @param gene - gene to get the proteins
     *
     * @return list of associated assays
     */
    @Override
    public List<Assay> getAssaysByGene(Gene gene){
        Protein protein  = gene.getProtein();

        return this.getAssays().stream()
                        .filter(assay -> assay.getUsedProteins().contains(protein))
                        .collect(Collectors.toList());
    }

    /**
     * Returns all Proteins that have a measurement above or equal to 'meas' in any Assay
     *
     * @param meas - threshold value
     * @return A list of pairs where the Protein is left and the measured score from the assay is right
     */
    @Override
    public List<Pair<Protein, Double>> getAssayResultsByMeas(Double meas){
       List<Pair<Protein, Double>> results = new ArrayList<>();

       for(Assay assay: getAssays()){
           List<Double> measurements = assay.getMeasurements();
           List<Protein> proteins = assay.getUsedProteins();

           for (int i = 0; i < measurements.size(); i++) {
               Double m = measurements.get(i);

               if(m >= meas){
                   //results.add(new ImmutablePair<Protein,Double>(proteins.get(i), m));
                   results.add(new Pair<>(proteins.get(i), m));
               }
           }
       }

       return results;
    }


    /**
     * Return all Scores and assoc. Assays for a given Protein
     *
     * @param protein - protein to look up
     * @return List of Pairs of assays and results for the given protein on that assay
     */
    @Override
    public List<Pair<Assay, Double>> getScores(Protein protein) {
        List<Pair<Assay, Double>> results = new ArrayList<>();

        for (Assay assay : getAssays()) {
            List<Double> measurements = assay.getMeasurements();
            List<Protein> proteins = assay.getUsedProteins();

            for (int i = 0; i < proteins.size(); i++) {
                if (proteins.get(i).equals(protein)) {
                    results.add(new Pair<>(assay, measurements.get(i)));
                    //results.add(new ImmutablePair<Assay,Double>(assay, measurements.get(i)));
                    // http://www.javased.com/index.php?api=org.apache.commons.lang3.tuple.Pair
                    // https://www.programcreek.com/java-api-examples/?api=org.apache.commons.lang3.tuple.ImmutablePair
                }
            }
        }

        return results;
    }

    /**
     * Returns a protein by given identifier. Returns Optional.empty if there is no protein with this name
     *
     * @param identifier - id of the protein
     * @return Optional protein
     */
    @Override
    public Optional<Protein> getProteinByName(String identifier){
        Optional<Protein> r = this.getProteins().stream().filter(p -> p.getIdentifier().equals(identifier)).findFirst();

        if(!r.isPresent()){
            System.err.println("DBQueryLocal: could not find protein by name: " + identifier);
        }
        return r;
    }


    /**
     * Returns a gene by given identifier. Returns Optional.empty if there is no gene with this name
     *
     * @param name - id  of a gene
     * @return Optional protein
     */
    @Override
    public Optional<Gene> getGeneByName(String name){
        return this.getGenes().stream().filter(p -> p.getIdentifier().equals(name)).findFirst();
    }



    /**
     * Returns a assay by given identifier. Returns Optional.empty if there is no assay with this name
     *
     * @param name - id  of a gene
     * @return Optional protein
     */
    @Override
    public Optional<Assay> getAssayByName(String name){
        return this.getAssays().stream().filter(p -> p.getName().equals(name)).findFirst();
    }
}

UPDATE3:执行日志

来自IntelliJ的执行日志。最后三行出现 在浏览器中调用“ localhost:8080”。之后,使用停止按钮手动终止过程。

1 个答案:

答案 0 :(得分:1)

模板的默认百里香前缀(它是属性:spring.thymeleaf.prefix)是:classpath:/ templates /

如果您将root.html移至src / main / resources / templates,那么即使我什么都没错过,它也可以正常工作。