Есть кастомный объект Appointment, пишу для него кастомный контроллер. В одном из мест VF странички есть поля inputField для ввода Datetime и числа, которые потом должны пойти в новый объект. Но при попытке добавить новый объект в базу с данными из этих полей, получаю ошибку о том, что необходимые поля пустые. В чём проблема? Почему метод, добавляющий объект в базу в контроллере, не видит значения этих полей со странички? (проблема с полями Appointment_Date__c и Duration__c) 
Вот код:
VF страница
<apex:page docType="html-5.0" controller="HospitalController" showHeader="false" sidebar="false">
<apex:form >
<apex:pageBlock title="Appointmets Table">
<!-- Select a doctor -->
<apex:pageBlockSection >
<apex:selectList label="Select a doctor" value="{! selectedDoctor }" size="1">
<apex:selectOptions value="{! doctors }"/>
<apex:actionSupport event="onchange"
reRender="app_list1, app_list2, app_list3"/>
</apex:selectList>
</apex:pageBlockSection>
<!-- Select a patient -->
<apex:pageBlockSection >
<apex:selectList label="Select a patient" value="{! selectedPatient }" size="1">
<apex:selectOptions value="{! patients }"/>
</apex:selectList>
</apex:pageBlockSection>
<!-- Appointment date -->
<apex:pageBlockSection >
<apex:inputField label="Appointment date"
value="{!appt.Appointment_Date__c}"
required="false"/>
</apex:pageBlockSection>
<!-- Duration -->
<apex:pageBlockSection >
<apex:inputField label="Duration in minutes"
value="{!appt.Duration__c}"
required="false"/>
</apex:pageBlockSection>
<!-- Add new appointment button -->
<apex:pageBlockSection >
<apex:commandButton immediate="false" reRender="app_list3" action="{!addNewAppt}" value="Add New Appointment" />
</apex:pageBlockSection>
<apex:pageBlockTable id="app_list3" value="{! tableAppointments }" var="apt">
<apex:column headerValue="Action">
<apex:outputLink value="{! URLFOR('/' + apt.Id)}">
View
</apex:outputLink>
</apex:column>
<apex:column headerValue="Doctor's Name" value="{! apt.Doctor__c }"/>
<apex:column headerValue="Patient's Name" value="{! apt.Patient__c }"/>
<apex:column headerValue="Appointment Date" value="{! apt.Appointment_Date__c }"/>
<apex:column headerValue="Duration in minutes" value="{! apt.Duration__c }"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
public class HospitalController {
    
    private Appointment__c appt;
    public String selectedDoctor {get; set;}
    public String selectedPatient {get; set;}
    public Datetime appDate {get; set;}
    public Integer duration {get; set;}    
    public Appointment__c getAppt(){
        return appt; 
    }
  
    
    public void addNewAppt(){
        Appointment__c app = new Appointment__c();
        app.Appointment_Date__c = appt.Appointment_Date__c;
        app.Doctor__c = selectedDoctor;
        app.Duration__c = appt.Duration__c;
        app.Patient__c = selectedPatient;
        insert app;
    }
}
Потому что проперти appt не имеет публичного сеттера.
Замени 
private Appointment__c appt;
на 
public Appointment__c appt {get; set;}
Вылетает ошибка "Attempt to de-reference a null object
Error is in expression '{!addNewAppt}' in component <apex:commandButton> in page hospital: Class.HospitalController.addNewAppt: line 66, column 1" 
на строке 
app.Duration__c = appt.Duration__c;
ну так appt надо инициализировать прежде чем использовать
как и остальные переменные класса
Так разве те его поля, которые мне нужны, не инициализируются через inputField?
Вернее именно в этом и состоит мой изначальный вопрос. Почему нужные мне поля не инициализируются через inputField?
чтобы инициализировать "его" поля - нужно чтобы "он" существовал
т.е. не достаточно просто обьявить переменную - нужно присвоить ей значение
добавь конструктор в класс
присвой в нем начальные значения для своих полей класса
примерно вот так
public class HospitalController {    public Appointment__c appt {get; set;}
    public String selectedDoctor {get; set;}
    public String selectedPatient {get; set;}
    public Datetime appDate {get; set;}
    public Integer duration {get; set;}
    public HospitalController() {
        this.appt = new Appointment__c();
        this.selectedDoctor = '';
        this.selectedPatient = '';
        this.appDate = System.now();
        this.duration = 30;
    }
    public PageReference addNewAppt() {
        try {
            this.appt.Doctor__c = selectedDoctor;
            this.appt.Patient__c = selectedPatient;
            //Duration and Appointment Date will be populated by VF page
            
            insert this.appt;
        }
        catch (Exception ex) {
            ApexPages.addMessages(ex);
        }
        
        return NULL;
    }
    
}
добавь конструктор в класс
присвой в нем начальные значения для своих полей класса
примерно вот так
public class HospitalController {    public Appointment__c appt {get; set;}
    public String selectedDoctor {get; set;}
    public String selectedPatient {get; set;}
    public Datetime appDate {get; set;}
    public Integer duration {get; set;}
    public HospitalController() {
        this.appt = new Appointment__c();
        this.selectedDoctor = '';
        this.selectedPatient = '';
        this.appDate = System.now();
        this.duration = 30;
    }
    public PageReference addNewAppt() {
        try {
            this.appt.Doctor__c = selectedDoctor;
            this.appt.Patient__c = selectedPatient;
            //Duration and Appointment Date will be populated by VF page
            
            insert this.appt;
        }
        catch (Exception ex) {
            ApexPages.addMessages(ex);
        }
        
        return NULL;
    }
    
}