org.springframework.expression.spel.SpelEvaluationException:EL1007E:属性或字段' chargesName'无法在null上找到

时间:2017-11-21 06:12:55

标签: hibernate spring-boot spring-data-jpa thymeleaf

  

我的项目基于spring boot,Thymeleaf,mysql,html和Jquery。

我的方案 是获取列表迭代并在HTML的表格第1列中显示数据并发布从动态输入字段获取的数据(html-chargesName和输入量)并将其保存到相关列中,因此需要热门春季启动@RestController。

但是我得到的是Thymeleaf ERROR

  

org.springframework.expression.spel.SpelEvaluationException:EL1007E:   财产或字段' chargeName'在null

上找不到

以下是完整代码...



/**
 * This is for set charges form
 */

$(document).ready(function() {
	 $("select").change(function() 
			 {
		    var amttype = $(this).val();
		    if (amttype == 1) 
		    {
		      $("#amt1").show();
		      $("#amt2").hide();
		      $("#amt3").hide();
		      
		    } 
		    else if (amttype == 2) 
		    {
		    	  $("#amt1").hide();
			      $("#amt2").show();
			      $("#amt3").hide();
		    } 
		    else if (amttype == 3) 
		    {
		    	  $("#amt1").hide();
			      $("#amt2").hide();
			      $("#amt3").show();
		    }
		    else {
		    	  $("#amt1").hide();
			      $("#amt2").hide();
			      $("#amt3").hide();
		    }
		    
		  });
	
});

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="ISO-8859-1">
    <title>Insert title here</title>
     <!-- bootstrap css lib --> 
          <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    </head>
    <body>
    	<!-- Bootstrap/Jquery CDN library files -->
    	<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
    	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    	<!-- External JQuery Script -->
    	<script type="text/javascript" src="../js/formjs/setchargesform.js"></script>
    	
    <!-- Body Content Goes Here -->	
    	 <div class="container">
    	<form method="post" th:object="${entSetCharges}" th:action="@{/updatesetcharges}">
    	<div class="table-responsive"> 
    	
    	<table class="table table-hover">
    	<thead>
    	    <tr>
          <th>Charge Name</th>
          <th>Amount</th>
          <th>Charge/Unit Type</th>
        </tr>
        </thead>
        
        <tbody>
        <tr th:each="savedcharges:${savedchargeslist}">
          <td>
          <label th:text="${savedcharges.chargesName}" th:value="${savedcharges.chargesName}" th:field="*{chargesName}"></label>
          </td>
          
          <td>
          <input id="amt1" class="form-control" th:field="*{perFlat}">
          <input id="amt2" class="form-control" th:field="*{perUnit}">
          <input id="amt3" class="form-control" th:field="*{perSqrft}">
          </td>
          
          <td>
    		<select id="societyname" class="form-control" th:field="*{tempunitType}">
    		<option value="1" selected="selected">perFlat</option>
    		<option value="2">perUnit</option>
    		<option value="3">perSqrft</option>
    		</select>
          </td>
        </tr>
        </tbody>
        
    	</table>
    	</div>
    	
    	<button type="submit" class="btn btn-info">Submit</button>
    	<button type="reset" class="btn btn-warn">Reset</button>
    	</form>
    	</div>
    	<!-- Body content finishes -->
    </body>
    </html>
&#13;
&#13;
&#13;

@RestController

@GetMapping(value="/setchargeslist")
    public ModelAndView doGetSetchargesList()
    {
        List<EntSetCharges> listCharges = new ArrayList<>();
        ModelAndView respondResult = new ModelAndView("SetCharges");
        try {
            /*Get the set charges list*/
            listCharges = serSetCharges.doGetSetChargesList();
            if(listCharges!=null)
            {
            respondResult.addObject("savedchargeslist",listCharges);
            }
            else
            {
                respondResult.addObject("savedchargeslist",new ArrayList<>());
            }

        } catch (Exception e) {
            // TODO: handle exception
        }
        return respondResult;
    }

ENTITY

@Entity
@Table(name="setcharges")
public class EntSetCharges implements Serializable
{

    /**
     * 
     */
    private static final long serialVersionUID = 3827507518731160293L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="pksetcharges")
    private int pkSetCharges;

    @Column(nullable=false)
    private String chargesName;
    @ColumnDefault("0")
    private int perFlat;
    @ColumnDefault("0")
    private double perUnit;
    @ColumnDefault("0")
    private double perSqrft;

    @Version
    private int version;
    private Boolean is_active;
    private String created_by;
    private Date created_ts;
    private String modified_by;
    private Date modified_ts;
    private String approved_by;
    private Date approved_ts;

2 个答案:

答案 0 :(得分:1)

您使用了html页面顶部的表单:

<form method="post" th:object="${entSetCharges}" th:action="@{/updatesetcharges}">

th:field="*{chargesName}绑定到th:object="${entSetCharges}内的对象/ bean。这意味着您正在chargesName对象中搜索不存在或为空的entSetCharges字段。

<强>解决方案:

  • 可能会将th:field="*{chargesName}"更改为${savedcharges.chargesName}表达式以访问对象的字段。

  • 尝试在返回行上方添加respondResult.addObject("entSetCharges",new EntSetCharges());。您的观点不会自动为您创建此对象。

答案 1 :(得分:0)

我初始化实体对象,如 respondResult.addObject(“entSetCharges”,new EntSetCharges());

@GetMapping(value="/setchargeslist")
    public ModelAndView doGetSetchargesList()
    {
        List<EntSetCharges> listCharges = new ArrayList<>();
        ModelAndView respondResult = new ModelAndView("SetCharges");
        try {
            /*Get the set charges list*/
            listCharges = serSetCharges.doGetSetChargesList();
            if(listCharges!=null)
            {
            respondResult.addObject("savedchargeslist",listCharges);
            respondResult.addObject("entSetCharges",new EntSetCharges());
            }
            else
            {
                respondResult.addObject("savedchargeslist",new ArrayList<>());
            }

        } catch (Exception e) {
            // TODO: handle exception
        }
        return respondResult;
    }