代码之家  ›  专栏  ›  技术社区  ›  Shushiro

Springboot:Localhost:8080导致白页错误,而不是显示内容

  •  0
  • Shushiro  · 技术社区  · 7 年前

    我试着用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);
        }
    }
    

    应用程序控制器:

    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";
        }
    
    }
    

    根.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 回复  |  直到 7 年前
        1
  •  1
  •   miwoe    7 年前

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

    如果将root.html移到src/main/resources/templates,如果我没有遗漏任何其他内容,它应该可以工作。