Ни BindingResult, ни простой целевой объект для имени компонента 'team' не доступны в качестве атрибута запроса - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь сохранить простой ввод формы в базу данных, используя Spring MVC, Hibernate и Spring form jstl.

Когда я добавил строку <form:input path="teamName" type="text" class="form-control" id="TeamNameInput" placeholder="Team Name"/>

Я получаю эту ошибку: Neither BindingResult nor plain target object for bean name 'team' available as request attribute

Вот мой код:

Субъект команды:

@Entity
@Table(name = "teams")
public class Team {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;

@Column(name = "teamname")
private String teamName;
//  
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="users_teams",
joinColumns=@JoinColumn(name="teams_id"),
inverseJoinColumns=@JoinColumn(name="username"))
private List<User> users;

// getters and setters

/**
 * @return the id
 */
public int getId() {
    return id;
}

/**
 * @param id the id to set
 */
public void setId(int id) {
    this.id = id;
}

public Team() {
    // TODO Auto-generated constructor stub
}

public Team(String teamName) {
    this.teamName = teamName;
}

/**
 * @return the groupName
 */
public String getTeamName() {
    return teamName;
}

/**
 * @return the users
 */
public List<User> getUsers() {
    return users;
}

/**
 * @param users the users to set
 */
public void setUsers(List<User> users) {
    this.users = users;
}

/**
 * @param teamName the groupName to set
 */
public void setTeamName(String teamName) {
    this.teamName = teamName;
}

/* (non-Javadoc)
 * @see java.lang.Object#toString()
 */
@Override
public String toString() {
    return "Team [teamName=" + teamName + ", users=" + 
users + "]";
}



}

Пользователь:

@Entity
@Table(name="users")
public class User {

@Id
@Column(name="username")
private String userName;

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="users_teams",
joinColumns=@JoinColumn(name="username"),
inverseJoinColumns=@JoinColumn(name="teams_id"))
private List<Team> teams;

public User() {
    // TODO Auto-generated constructor stub
}

public User(String userName) {
    this.userName = userName;
}

/**
 * @return the username
 */
public String getUsername() {
    return userName;
}

/**
 * @param username the username to set
 */
public void setUsername(String userName) {
    this.userName = userName;
}

/**
 * @return the teams
 */
public List<Team> getTeams() {
    return teams;
}

/**
 * @param teams the teams to set
 */
public void setTeams(List<Team> teams) {
    this.teams = teams;
}

public void add(Team team) {
    if (teams == null) {
        teams = new ArrayList<>();
    }

    teams.add(team);
}

/* (non-Javadoc)
 * @see java.lang.Object#toString()
 */
@Override
public String toString() {
    return "User [username=" + userName + ", teams=" + 
teams + "]";
}


}

Контроллер:

@Controller
public class Controller {

@GetMapping("/")
public String listProjects(Model theModel) {


    /*
     * To get the username using Spring Security
     */     
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String username = auth.getName(); 

    theModel.addAttribute("username", username);

    /*
     * Get the current user by username
     */     
    User user = userService.findByUsername(username);

    /*
     * Get the teams of the current user
     */     
    List<Team> theTeams = user.getTeams();

    //Add teams to the model attribute
    theModel.addAttribute("teams", theTeams);

    System.out.println("This is a test " + username);

    return "home";

}

@PostMapping("/saveTeam")
public String saveOrUpdateTeams(@ModelAttribute("team") Team 
theTeam,BindingResult result) {
    //GET USER BY USERNAME FROM DATABASE
    Authentication auth = 
SecurityContextHolder.getContext().getAuthentication();
    String username = auth.getName(); 

    User user = userService.findByUsername(username);


    // GET TEAMS OF CURRENT USER
    user.add(theTeam);

    userService.saveOrUpdate(user);

    return "redirect:/";
}

JSP:

                    <form:form 
                            action="${pageContext.request.contextPath }/saveTeam" 
                            modelAttribute="team"
                            method="POST">
                        <div class="form-group">                            
                            <label for="TeamNameInput">Team Name</label> 
                            <form:input path="teamName"
                                type="text" class="form-control" id="TeamNameInput" 
                                placeholder="Team Name"/>
                        </div>


                        <div class="modal-footer">
                            <button type="button" class="btn btn-secondary"
                                data-dismiss="modal">Close</button>
                            <button type="submit" class="btn btn-primary">Save
                                changes</button>
                        </div>
                    </form:form>

И вот ошибка, которую я получаю:

org.apache.jasper.JasperException: An exception occurred processing [/WEB-INF/view/home.jsp] at line [57]

54:                                  
method="POST">
55:                             <div 
class="form-group">                         
56:                                 <label for="TeamNameInput">Team Name</label> 
57:                                 <form:input path="teamName"
58:                                     type="text" class="form-control" id="TeamNameInput" 
59:                                     placeholder="Team Name"/>
60:                             </div>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:593)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequestDispatcher.forward(HeaderWriterFilter.java:143)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:170)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)

Root Cause

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'team' available as request attribute
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:153)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:177)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:163)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:122)
org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:459)
org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:356)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:86)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:83)
org.apache.jsp.WEB_002dINF.view.home_jsp._jspx_meth_form_005finput_005f0(home_jsp.java:490)
org.apache.jsp.WEB_002dINF.view.home_jsp._jspx_meth_form_005fform_005f1(home_jsp.java:432)
org.apache.jsp.WEB_002dINF.view.home_jsp._jspService(home_jsp.java:197)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequestDispatcher.forward(HeaderWriterFilter.java:143)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:170)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)

Что не работает в моем коде?

Я пытался изменить @PostMapping на @RequestMapping(value = "/saveTeam", method = RequestMethod.POST)

и добавил <form:hidden path="id"/>, но ничего не изменилось.

Почему атрибут моей модели team не обнаружен?

1 Ответ

0 голосов
/ 27 марта 2019

Как упомянул @JBNizet в своем комментарии, мне нужно было добавить атрибут модели "team" в метод контроллера, используемый для отображения формы (который отображается как "/").

Мне пришлось добавить следующие две строки кода:

    Team theTeam = new Team();
    theModel.addAttribute("team", theTeam);

Вот полный код метода контроллера:

    @GetMapping("/")
public String listProjects(Model theModel) {


    /*
     * To get the username using Spring Security
     */     
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String username = auth.getName(); 

    theModel.addAttribute("username", username);

    Team theTeam = new Team();
    theModel.addAttribute("team", theTeam);

    /*
     * Get the current user by username
     */     
    User user = userService.findByUsername(username);

    /*
     * Get the teams of the current user
     */     
    List<Team> theTeams = user.getTeams();

    //Add teams to the model attribute
    theModel.addAttribute("teams", theTeams);

    System.out.println("This is a test " + username);

    return "home";

}
...