2017-06-20 44 views
0

我创建的应用程序使用spring数据而不使用spring引导,JPA使用postgresql和Vaadin。我试图在Vaadin标签上显示SQL表中的数据。

我的问题是它是空的,我认为这是一个bean创建问题。

抱歉粘贴了很多代码行,但我不知道问题出在哪里。 主要Vaadin UI:Spring数据jpa + Vaadin Bean配置

@Theme("valo") 
@SpringUI 
@SuppressWarnings("serial") 
public class MyUI extends UI { 
    private UserRepository usersRepo; 
    @Autowired 
    public MyUI(UserRepository usersRepo){ 
     this.usersRepo = usersRepo; 
    )}; 
    @Override 
    protected void init(VaadinRequest request) { 
     Label label = new Label(usersRepo.findAll().toString()); 
     setContent(label); 
    } 
} 

用户等级:

@Entity 
@Table(name="workers", schema="public") 
public class User { 
    public User(String name, String surname, String username) { 
     this.name= name; 
     this.surname= surname; 
     this.username = username; 
    } 
    protected User(){ 

    } 
    @Id 
    @Column(name = "userId") 
    private Long userId; 
    @Column(name="name") 
    private String name; 
    @Column(name="surname") 
    private String surname; 
    @Column(name="username") 
    private String username; 
    public Long getUserId() { 
     return userId; 
    } 
    public void setUserId(Long userId) { 
     this.userId = userId; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getSurname() { 
     return surname; 
    } 
    public void setSurname(String surname) { 
     this.surname= surname; 
    } 
    public String getNameAndSurname(){ 
     return name+" "+surname; 
    } 
    @Override 
    public String toString() { 
     return "User [userId=" + userId + ", name=" + name + ", surname=" + surname+ ", username=" + username + "]"; 
    } 
    public String getUsername() { 
     return username; 
    } 
    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

的用户信息库:

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.ldapAuthentication().userSearchFilter("(sAMAccountName={0})") 
     .contextSource(contextSource()); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .csrf().disable() 
      .authorizeRequests().anyRequest().authenticated() 
      .and() 
      .formLogin().permitAll() 
      .and() 
      .logout().logoutUrl("/logout").logoutSuccessUrl("/login?logged-out").permitAll() // Logout success page is accessible to anybody 
      .and() 
      .sessionManagement().sessionFixation().newSession(); // Create completely new session 
    } 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/css/*"); 
    } 
    public LdapContextSource contextSource() { 
     LdapContextSource contextSource= new LdapContextSource(); 
     contextSource.setUrl("ldap://192.168.1.21:3268"); 
     contextSource.setBase("dc=ad,dc=example,dc=com,dc=pl"); 
     contextSource.setUserDn("CN=someGuy,OU=Users,DC=ad,DC=example,DC=com,DC=pl"); 
     contextSource.setPassword("somepassword"); 
     contextSource.setAnonymousReadOnly(false); 
     contextSource.setPooled(true); 
     contextSource.afterPropertiesSet(); 
     return contextSource; 
    } 
} 

安全:春季安全

public interface UserRepository extends JpaRepository<User, Long> { 
    List<User> findByNameStartsWithIgnoreCase(String imie); 
} 

Web安全配置初始化:

public class SecurityWebApplicationInitializer 
     extends AbstractSecurityWebApplicationInitializer { 
} 

Web上下文初始化:

public class WebContextInitializer implements WebApplicationInitializer { 
    @Override 
    public void onStartup(javax.servlet.ServletContext servletContext) 
      throws ServletException { 
     AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
     context.scan(WebContextInitializer.class.getPackage().getName()); 
     servletContext.addListener(new ContextLoaderListener(context)); 
     registerServlet(servletContext); 
    } 
    private void registerServlet(ServletContext servletContext) { 
     ServletRegistration.Dynamic dispatcher = servletContext.addServlet(
       "vaadin", SpringVaadinServlet.class); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/*"); 
    } 
} 

配置:

@Configuration 
@EnableVaadin 
public class MyConfiguration { 
    @Bean 
    @Autowired 
    public UserRepository userRepo(){ 
     return new UserRepository(){ 

      @Override 
      public void deleteAllInBatch() { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void deleteInBatch(Iterable<User> arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public List<User> findAll() { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public List<User> findAll(Sort arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public List<User> findAll(Iterable<Long> arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public <S extends User> List<S> findAll(Example<S> arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public <S extends User> List<S> findAll(Example<S> arg0, Sort arg1) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public void flush() { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public User getOne(Long arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public <S extends User> List<S> save(Iterable<S> arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public <S extends User> S saveAndFlush(S arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public Page<User> findAll(Pageable arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public long count() { 
       // TODO Auto-generated method stub 
       return 0; 
      } 

      @Override 
      public void delete(Long arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void delete(User arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void delete(Iterable<? extends User> arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void deleteAll() { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public boolean exists(Long arg0) { 
       // TODO Auto-generated method stub 
       return false; 
      } 

      @Override 
      public User findOne(Long arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public <S extends User> S save(S arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public <S extends User> long count(Example<S> arg0) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 

      @Override 
      public <S extends User> boolean exists(Example<S> arg0) { 
       // TODO Auto-generated method stub 
       return false; 
      } 

      @Override 
      public <S extends User> Page<S> findAll(Example<S> arg0, Pageable arg1) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public <S extends User> S findOne(Example<S> arg0) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public List<User> findByImieStartsWithIgnoreCase(String imie) { 
       // TODO Auto-generated method stub 
       return null; 
      } 
     }; 
    } 
    @WebServlet(value = "/*", asyncSupported = true) 
    public static class Servlet extends SpringVaadinServlet { 
    } 
} 

最后的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>4.0.0</modelVersion> 

    <groupId>pl.com.example</groupId> 
    <artifactId>SpringSecurityVaadin</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>SpringSecurityVaadin</name> 

    <prerequisites> 
     <maven>3</maven> 
    </prerequisites> 

    <properties> 
     <vaadin.version>8.0.6</vaadin.version> 
     <vaadin.plugin.version>8.0.6</vaadin.plugin.version> 
     <jetty.plugin.version>9.3.9.v20160517</jetty.plugin.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.8</maven.compiler.source> 
     <maven.compiler.target>1.8</maven.compiler.target> 
     <vaadin.widgetset.mode>local</vaadin.widgetset.mode> 
     <jdk.version>1.6</jdk.version> 
     <spring.version>4.3.9.RELEASE</spring.version> 
     <spring.security.version>4.2.3.RELEASE</spring.security.version> 
     <jstl.version>1.2</jstl.version> 
    </properties> 

    <repositories> 
     <repository> 
      <id>vaadin-addons</id> 
      <url>http://maven.vaadin.com/vaadin-addons</url> 
     </repository> 
    </repositories> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>com.vaadin</groupId> 
       <artifactId>vaadin-bom</artifactId> 
       <version>${vaadin.version}</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

     <!-- Spring Security --> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.0.1</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.vaadin</groupId> 
      <artifactId>vaadin-server</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.vaadin</groupId> 
      <artifactId>vaadin-push</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.vaadin</groupId> 
      <artifactId>vaadin-client-compiled</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.vaadin</groupId> 
      <artifactId>vaadin-themes</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.vaadin</groupId> 
      <artifactId>vaadin-spring</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.3.9.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-ldap</artifactId> 
      <version>4.2.3.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>42.1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.eclipse.persistence</groupId> 
      <artifactId>javax.persistence</artifactId> 
      <version>2.1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-jpa</artifactId> 
      <version>1.11.4.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>3.0.0</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>com.vaadin</groupId> 
       <artifactId>vaadin-maven-plugin</artifactId> 
       <version>${vaadin.plugin.version}</version> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-clean-plugin</artifactId> 
       <version>3.0.0</version> 
       <configuration> 
        <filesets> 
         <fileset> 
          <directory>src/main/webapp/VAADIN/themes</directory> 
          <includes> 
           <include>**/styles.css</include> 
           <include>**/styles.scss.cache</include> 
          </includes> 
         </fileset> 
        </filesets> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.eclipse.jetty</groupId> 
       <artifactId>jetty-maven-plugin</artifactId> 
       <version>${jetty.plugin.version}</version> 
       <configuration> 
        <scanIntervalSeconds>2</scanIntervalSeconds> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <profiles> 
     <profile> 
      <id>vaadin-prerelease</id> 
      <activation> 
       <activeByDefault>false</activeByDefault> 
      </activation> 

      <repositories> 
       <repository> 
        <id>vaadin-prereleases</id> 
        <url>http://maven.vaadin.com/vaadin-prereleases</url> 
       </repository> 
       <repository> 
        <id>vaadin-snapshots</id> 
        <url>https://oss.sonatype.org/content/repositories/vaadin-snapshots/</url> 
        <releases> 
         <enabled>false</enabled> 
        </releases> 
        <snapshots> 
         <enabled>true</enabled> 
        </snapshots> 
       </repository> 
      </repositories> 
      <pluginRepositories> 
       <pluginRepository> 
        <id>vaadin-prereleases</id> 
        <url>http://maven.vaadin.com/vaadin-prereleases</url> 
       </pluginRepository> 
       <pluginRepository> 
        <id>vaadin-snapshots</id> 
        <url>https://oss.sonatype.org/content/repositories/vaadin-snapshots/</url> 
        <releases> 
         <enabled>false</enabled> 
        </releases> 
        <snapshots> 
         <enabled>true</enabled> 
        </snapshots> 
       </pluginRepository> 
      </pluginRepositories> 
     </profile> 
    </profiles> 
</project> 

结果是:

com.example.server.DefaultErrorHandler DODEFAULT重度: 显示java.lang.NullPointerException在 pl.com.example.SpringSecurityVaadin.MyUI.init(MyUI.java:47)

这是本行:

Label label = new Label(usersRepo.findAll().toString()); 

我不知道问题出在哪里,我配置豆错了吗?或者是其他东西?

问候,拉法尔

+0

UsersRepo不自动布线。但[MCvE]会更好如果这个作品让我知道我会发布它作为答案 – efekctive

+0

你是否自动装配所有的服务,存储库classess。 – Akash

+0

我认为你应该把@autowired UserRepository,并确保你的用户回购声明为春季服务 – Zakaria

回答

0
@Theme("valo") 
@SpringUI 
@SuppressWarnings("serial") 
public class MyUI extends UI { 
    private UserRepository usersRepo; 
    @Autowired 
    public MyUI(UserRepository usersRepo){ 
     this.usersRepo = usersRepo; 
    )}; 

这是vaadin应用程序的入口点。 usersRepo不是自动装配的。任何使用它都会导致NPE。这应该适合你

@Autowired 
    private UserRepository usersRepo; 
+0

我试着autowire这个,但仍然是相同的NPE,我也试过这样的事情:\t \t'ApplicationContext ctx = new''AnnotationConfigApplicationContext(MyConfiguration.class);' \t \t'UserRepository usersRepo1 =''ctx.getBean(UserRepository.class);' \t \t'标签标记=新标签(usersRepo1.findAll()的toString()) ;'而且NPE – Rafalsonn

+0

OP有一个自动布线构造函数。我不明白为什么这应该被一个自动布线领域取代... – Morfic

+0

@Morfic这是vaadin入口点类。构造函数注释被忽略的可能性非常高。我使用没有构造函数的vaadin,并且像冠军一样工作。所以如果这不起作用,我会提供一个[MCVE],因为代码太多。我使用这种模式广泛” ......主题( “淡水河谷”) ... SpringUI(PATH = “客户端”) 公共最后一类ClientView扩展UI { \t ...自动装配Autowired \t私人RestTemplate ... 。“ – efekctive