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

dat*_*n94 5 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?
Run Code Online (Sandbox Code Playgroud)

我认为问题是关于 Optional in Service 当我使用 Spring Data findById() 这是我的代码

房间模型

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


}
Run Code Online (Sandbox Code Playgroud)

客房服务

public interface RoomService {


Optional<Room> findOne(String id);


}
Run Code Online (Sandbox Code Playgroud)

客房服务工具

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

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

    return roomRepository.findById(id);
}

}
Run Code Online (Sandbox Code Playgroud)

控制器

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

房间详情.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>
Run Code Online (Sandbox Code Playgroud)

dav*_*xxx 6

org.springframework.expression.spel.SpelEvaluationException:EL1008E: 在“java.util.Optional”类型的对象上找不到属性或字段“name” ——可能不是公共的或无效的?

意味着 Spring 无法插入name模板中使用的属性:

  <h4><tr th:text="${room.name}"></h4>
Run Code Online (Sandbox Code Playgroud)

这是预期的,因为您将Optional<Room>对象传递给 MVC 模型而不是传递Room对象。在将其添加到模型之前,
您必须解开包含在 中的对象Optional
例如 :

romService.findOne(id).ifPresent(o -> model.addAttribute("room", o));
Run Code Online (Sandbox Code Playgroud)