2016-02-22 3 views
0

Я реструктурирую приложение, которое у меня есть. В текущем проекте у меня есть всякая логика для объекта person в одном классе (Person), но я понял, что лучше, чтобы этот класс Person должен описывать только модель данных и чтобы все действия вокруг модели данных Person лучше обрабатывается классом Controller (например, PersonController).null значение для заметок возвращено

Когда я переношу такой код из класса Person в PersonController, я получаю вместо возвращаемого значения NotesDocument.

Ниже приведен пример кода:

public void getByUnid(String unid) throws NotesException{ 
     Database db = dao.getDatabase(); 
     Document doc = db.getDocumentByUNID(unid);  
     if (null == doc) { 
      //doc not found 
     } else { 
      //doc found 
      prepareDoc(doc); 
     } 
     doc.recycle(); 
     db.recycle(); 
    } 


    private void prepareDoc(Document doc) throws NotesException { 
      fname = doc.getItemValueString("fname");  
//...get other fields 
    } 

Обычно я бы назвал Person.getByUnid (ID) и он работает отлично. Когда я вызываю PersonController.getByUnid (id), значение doc равно null.

Я делаю вызов в событии beforeonpageload на xpage, например. person.xsp:

<xp:this.beforePageLoad><![CDATA[#{javascript: 

var id = paramValues.get("UNID"); 

if (id != null){ 
    PersonController.getByUnid(id.toString()); 
} 

else{ 
    Person.create(); 
}}]]></xp:this.beforePageLoad> 

Что я делаю не так, или я должен включать в себя класс Person в классе PersonController?

+0

Есть ли db не null? существует ли единое целое? имеет ли пользователь доступ к документу? –

+0

Я думаю, нам нужно немного больше информации. Когда getByUnid находился в классе person, он загружал все данные из документа, который поступает из db, который загружается dao. Имеет ли personController нулевое дао? –

+0

Я думаю, проблема заключается в том, что объект Person не существует, когда я пытаюсь читать значения из него, например. Person.fname. До того, как объект Person уже был загружен. Поэтому мне интересно, как я могу инициализировать объект Person из PersonController с загруженными значениями? – Malin

ответ

3

Я не думаю, что вы можете получить прямой ответ, не показывая весь соответствующий код. Например, мы не можем видеть, откуда в этом случае происходит «dao».

Но это запрещено. Я бы поставил под сомнение необходимость в «PersonController». Это действительно может быть более «Java Purist», и это хорошо, но если у вас что-то работает без него, я бы сказал, что просто поработайте с тем, что работает и рефакторирует позже, если потребуется.

Ниже приведен личный класс. У меня есть довольно старый пример, но по сей день я по-прежнему использую те же понятия. У меня есть различные методы «загрузчика», которые отвечают за получение документа, а затем передаются методу значений нагрузки для заполнения объекта. Метод сохранения в основном отменяет процесс.

Так что снова - если вы разместите больше кода, мы сможем рассмотреть исходный вопрос.

На примерах NotesIn9.com или XPages.TV есть примеры java и XPages, если они вам нужны.

package com.notesin9.examples; 
import java.io.Serializable; 
import lotus.domino.*; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.text.ParseException; 
import java.util.ArrayList; 
import java.util.Date; 

import com.ZetaOne.util.*; 


public class Person implements Serializable, Comparable<Person> { 
    private static final long serialVersionUID = 1L; 

    private String firstName; 
    private String lastName; 
    private String city; 
    private boolean readOnly; 
    private String unid; 
    private Boolean newNote; 
    private String unique; 

    public Person() { 

    } 

    public void create() throws NotesException{ 
     // System.out.println("Creating New"); 
     newNote = true;  
     JSFUtil jsfUtil = new JSFUtil(); 
     Session session = jsfUtil.getSession(); 
     unique = String.valueOf(session.evaluate("@Unique").get(0)); 
    } 

    public void loadByKey(String key) throws NotesException { 
     // Loading by unique key to the document 
     JSFUtil jsfUtil = new JSFUtil(); 
     Session session = jsfUtil.getSession(); 

     Database currentDB = jsfUtil.getCurrentDatabase(); 
     View mainView = currentDB.getView("byKey"); 
     Document doc = mainView.getDocumentByKey(key); 

     if (null == doc) { 
      System.out.println("Document not found"); 
     } else { 
      loadValues(doc); 
     } 

     doc.recycle(); 
     mainView.recycle(); 

    } 
    public void loadByUnid(String unid) throws NotesException{ 
     // Loading by document unid 
     JSFUtil jsfUtil = new JSFUtil(); 
     Session session = jsfUtil.getSession(); 

     Database currentDB = jsfUtil.getCurrentDatabase(); 
     Document doc = currentDB.getDocumentByUNID(unid); 

     if (null == doc) { 
      System.out.println("Document not found"); 
     } else { 
      loadValues(doc); 
     } 
     doc.recycle(); 

    } 

    public void loadValues(Document doc) throws NotesException { 
     firstName = doc.getItemValueString("firstName"); 
     lastName = doc.getItemValueString("lastName"); 
     city = doc.getItemValueString("city"); 
     newNote = false; 
     unique = doc.getItemValueString("unique"); 
     unid = doc.getUniversalID(); 
     // System.out.println("Person Loaded"); 
    } 


    public void save() throws NotesException { 
     JSFUtil jsfUtil = new JSFUtil(); 
     Session session = jsfUtil.getSession(); 

     Database currentDB = jsfUtil.getCurrentDatabase(); 
     Document doc = null; // PlaceHolder 

     if (newNote) { 
      // True means never been saved 
      System.out.println("This is a new Doc"); 
      doc = currentDB.createDocument(); 
      doc.replaceItemValue("form", "person"); 
     } else { 
      System.out.println("This is an existing doc"); 
      doc = currentDB.getDocumentByUNID(unid); 

     } 
     // Common elements to save 
     doc.replaceItemValue("firstName", firstName); 
     doc.replaceItemValue("lastName", lastName); 
     doc.replaceItemValue("city", city); 
     doc.replaceItemValue("unique", unique); 

     // System.out.println("about to save"); 
     doc.save(); 
     doc.recycle(); 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getCity() { 
     return city; 
    } 

    public void setCity(String city) { 
     this.city = city; 
    } 

    public boolean isReadOnly() { 
     return readOnly; 
    } 

    public void setReadOnly(boolean readOnly) { 
     this.readOnly = readOnly; 
    } 

    public String getUnid() { 
     return unid; 
    } 

    public void setUnid(String unid) { 
     this.unid = unid; 
    } 

    public Boolean getNewNote() { 
     return newNote; 
    } 

    public void setNewNote(Boolean newNote) { 
     this.newNote = newNote; 
    } 

    public String getUnique() { 
     return unique; 
    } 

    public void setUnique(String unique) { 
     this.unique = unique; 
    } 

    public int compareTo(Person comparePerson) { 
     // Default by Last name Sort 
     String personName1 = this.getLastName().toUpperCase() + ", " + this.getFirstName().toUpperCase(); 
     String personName2 = comparePerson.getLastName().toUpperCase() + ", " + this.getFirstName().toUpperCase(); 

     //ascending order 
     return personName1.compareTo(personName2); 

     //descending order 
     //return cityName2.compareTo(cityName1); 

    } 
} 
+0

Спасибо за код. Сначала я использовал этот подход, и это было нормально. Проблема возникла, когда я переместил логику, чтобы загрузить документ человека из класса Person в класс PersonController. Я понимаю, что этим новым способом объект Person никогда не инициализируется, поэтому я не могу вызывать свойства из него, например. Person.fname/Person.getFname(), поэтому мне интересно, как я могу это сделать из класса PersonController? (загрузить объект Person из класса PersonController). – Malin

+0

Я думаю, что ответ описан где-то в этом посте http://dontpanic82.blogspot.se/2012/05/using-java-reflection-and-domino-form.html. в contructor для personcontroller я должен создать экземпляр класса человека, например. this.person = new Person(); некоторые работы ... – Malin

+0

Добро пожаловать. Я думаю, если бы у вас было это работает, я не совсем понимаю, как перейти к классу PersonController. Я большой поклонник pageControllers, но пока мне не нужен PersonController.Я был бы заинтересован в том, чтобы увидеть весь ваш код для этих 2 классов либо здесь, либо отправить мне по электронной почте на notesin9.com, если вам было интересно. –

Смежные вопросы