在'java.util.Optional'类型的对象上找不到属性或字段'name' - 可能不公开或无效?

时间:2018-06-18 07:42:22

标签: java spring

我想在点击房间名称时显示房间详细信息..但我有一个问题,我不知道为什么。我使用Spring MVC,Spring Boot,Spring Data和Thymeleaf

org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'name' cannot be found on object of type 'java.util.Optional' - maybe not public or not valid?

我认为当我使用Spring Data findById()时问题是关于服务中的Optional 这是我的代码

房间模型

@Entity
@Table(name ="room")
public class Room implements Serializable {
 private static final long serialVersionUID = 1L;
 @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID_room", nullable = false)
    private String id;


    @Column(name = "name_room", nullable = false)
    private String name;


    @Column(name = "Description")
    private String describe;

    @Column(name = "ID_status")
    private String status;

    @Column(name = "room_image")
    private String image;

    public Room() {
        super();
    }

    public Room(String id, String name, String describe, String status,String image) {
        super();
        this.id = id;
        this.name = name;
        this.describe = describe;
        this.status = status;
        this.image = image;

    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescribe() {
        return describe;
    }

    public void setDescribe(String describe) {
        this.describe = describe;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }


}

客房服务

public interface RoomService {


Optional<Room> findOne(String id);


}

客房服务实施

public class RoomServiceImpl implements RoomService {
@Autowired
private RoomRepository roomRepository;

@Override
public Optional<Room> findOne(String id) {

    return roomRepository.findById(id);
}

}

RomController

@GetMapping("/room/{id}/detail")
public String detail(@PathVariable String id, Model model) {
    model.addAttribute("room", romService.findOne(id));
    return "roomDetail";
}

roomDetail.html

<div class="col-md-7 single-top-in">
                    <div class="single-para">
                        <h4><tr th:text="${room.name}"></h4>
                        <div class="para-grid">
                            <span  class="add-to">$32.8</span>
                            <a href="#" class="hvr-shutter-in-vertical cart-to">Add to Cart</a>                 
                            <div class="clearfix"></div>
                         </div>
                        <h5>100 items in stock</h5>

                        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>

4 个答案:

答案 0 :(得分:3)

  

org.springframework.expression.spel.SpelEvaluationException:EL1008E:   在类型对象上找不到属性或字段'name'   'java.util.Optional' - 可能不公开或无效?

表示Spring无法插入模板中使用的name属性:

  <h4><tr th:text="${room.name}"></h4>

这是预期的,因为您将Optional<Room>对象传递给MVC模型而不是传递Room对象。 在将Optional添加到模型之前,您必须打开包含在romService.findOne(id).ifPresent(o -> model.addAttribute("room", o)); 中的对象 例如:

import cartopy.io.img_tiles as cimgt

答案 1 :(得分:0)

一个例子:

 if( user.isPresent() ) {
            model.addAttribute("user", user.get());

Long userId = ((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId();
        Optional<User> user = userService.findById(userId);

        if( user.isPresent() ) {
            model.addAttribute("user", user.get());
}

答案 2 :(得分:0)

我要提到的一件事,是百里香期望嵌套字段/属性的本机约定

private FieldType fieldname;
public FieldType getFieldname(){return this.fieldname;}
public void setFieldname(FieldType ff){this.fieldname=ff;}

请注意字段名称的大小写如何,但是getFieldname的首字母大写为'f'。对于二传手也一样。

如果您的班级有getfieldname()而不是getFieldname(),则可能会遇到问题

答案 3 :(得分:0)

在我的情况下,csv 使用 \t 而不是逗号创建的错误。替换或使用 \t 分隔符解决了问题。