Трудности с inputField

Трудности с inputField

Есть кастомный объект 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;}

Rustam Muhametdinov
Потому что проперти 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 надо инициализировать прежде чем использовать
как и остальные переменные класса

Rustam Muhametdinov
ну так 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;
}

}

Rustam Muhametdinov
чтобы инициализировать "его" поля - нужно чтобы "он" существовал
т.е. не достаточно просто обьявить переменную - нужно присвоить ей значение

добавь конструктор в класс
присвой в нем начальные значения для своих полей класса
примерно вот так

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

}


Да уж, глупая ошибка) Спасибо большое за помощь!

Interesting information? Help us, post link to social media..