public JAXBElement processFile(File file){
Class clazz = SomePojo.class;
JAXBElement jaxbElement = null;
try {
JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
jaxbElement = unmarshaller.unmarshal(new StreamSource(file), clazz);
} catch (Exception e) {
e.printStackTrace();
}
return jaxbElement;
}
Показаны сообщения с ярлыком Java. Показать все сообщения
Показаны сообщения с ярлыком Java. Показать все сообщения
23.07.2018
Анмаршаллинг XML в класс при помощи JAXB
27.04.2017
Список полей через java reflection
private List getElementMetadata(Class clazz){ List<Field> list = new ArrayList<>(); if (clazz.getSuperclass() != null && !clazz.getSuperclass().equals(Object.class)) { List<Field> sublist = getElementMetadata(clazz.getSuperclass()); for(Field field : sublist){ list.add(field); } } Field fields[] = clazz.getDeclaredFields(); for(Field field : fields){ list.add(field); } return list; }
28.08.2015
Weblogic: weblogic.jdbc.wrapper.Blob_oracle_sql_BLOB cannot be cast to oracle.sql.BLOB
Ошибка возникает потому, что типы oracle.sql сервер Weblogic обвязывает в свои из weblogic.jdbc.wrapper.
Решение 1 - отключить обвязку на уровне источника данных через консоль, галочку нужно снять:
Решение 2 (и предпочтительное) - выполнить приведение типов в коде.
Код до:
Решение 1 - отключить обвязку на уровне источника данных через консоль, галочку нужно снять:
Решение 2 (и предпочтительное) - выполнить приведение типов в коде.
Код до:
public Connection getServerConnection() {
System.out.println("DataSource = " + this._ds);
Connection conn = null;
try {
if (this.conn == null){
conn = this._ds.getConnection(); //меняем эту строку
}
} catch (SQLException var4) {
String msg = "ERROR. Cannot get connection from datasource: " + var4.getMessage();
System.out.println(msg);
var4.printStackTrace();
}
return conn;
}
Код после:import oracle.jdbc.OracleConnection;
import weblogic.jdbc.extensions.WLConnection;
public Connection getServerConnection() {
System.out.println("DataSource = " + this._ds);
Connection conn = null;
try {
if (this.conn == null){
conn = (((WLConnection) this._ds.getConnection()).getVendorConnection());
}
} catch (SQLException var4) {
String msg = "ERROR. Cannot get connection from datasource: " + var4.getMessage();
System.out.println(msg);
var4.printStackTrace();
}
return conn;
}
Класс WLConnection можно подключить через com.bea.core.datasource_1.9.0.0.jar08.11.2014
Создание оконного Java-приложения
Цель: создать простейшее оконное приложение на Java, выводить текст, переданный в качестве параметра.
07.07.2014
Особенность retainAM при использовании нескольких AM
Простой эксперимент позволит нам увидеть разницу между корневым и некорневыми Application Modules (AM).
10.06.2014
JBO-27122: SQL error during statement preparation
Ошибка появляется, если VO выполняется сначала с ограчением в n1 предикатов, затем в n2 предикатов, причем n2 < n1. Пример:
Для устранения ошибки достаточно принудительно очистить ограничение (раскомментировать строки во втором выполнении)
CausesVOImpl causeVO = getAm().getCausesVO1();
// первое выполнение
if (!causeVO.isPreparedForExecution()){
causeVO.setMaxFetchSize(999);
}
causeVO.executeEmptyRowSet();
causeVO.setWhereClause("CAUSE_NUMBER > :1 and GROUP_ID = :2");
causeVO.setWhereClauseParam(0, causeNumber);
causeVO.setWhereClauseParam(1, groupId);
causeVO.executeQuery();
// второе выполнение
CausesVOImpl causeVO = getAm().getCausesVO1();
if (!causeVO.isPreparedForExecution()){
causeVO.setMaxFetchSize(999);
}
causeVO.executeEmptyRowSet();
// causeVO.setWhereClause(null);
// causeVO.setWhereClauseParams(null);
causeVO.setWhereClause("GROUP_ID = :1");
causeVO.setWhereClauseParam(0, getEntityId());
try{
causeVO.executeQuery();
}catch (Exception e){
System.out.println(e.getMessage());
}
В приведенном примере ошибка возникнет при втором вызове executeQuery(). Как видим, setWhereClause и setWhereClauseParam не перекрывают ранее заданные значения.Для устранения ошибки достаточно принудительно очистить ограничение (раскомментировать строки во втором выполнении)
08.06.2014
Отчет из данных ViewObject
Мы можем выдать пользователю отчет сразу по нажатию кнопки, без создания конкаррента. Такое удобно, например, при выгрузке в Excel результатов с поисковой формы.
Ключевые моменты.
1) Формирование XMLNode c данными из VO. Первый параметр - глубина структуры XML.
Шаблон для нашего отчета будет иметь особенности. Имя группы будет составлено как Имя_VO || 'Row'. Например, если VO отчета назывался ReportVO, то группа будет названа ReportVORow. Имена элементов будут совпадать с именами атрибутов VO. Отдельная группа - вручную добавленные параметры шапки:
Ключевые моменты.
1) Формирование XMLNode c данными из VO. Первый параметр - глубина структуры XML.
XMLNode xmlNode = (XMLNode)reportVO.writeXML(4, XMLInterface.XML_OPT_ALL_ROWS);2) Добавление доп.параметров в XML (параметры шапки)
XMLNode xmlNode = (XMLNode)am.invokeMethod("fillWithVODataset");
XMLDocument doc = xmlNode.getDocument();
Element elem = doc.createElement("ReportInfo");
Element elemPeriod = doc.createElement("SomeParameter");
Text startPeriodVal = doc.createTextNode((String)someBean.getValue(pageContext));
elemPeriod.appendChild(startPeriodVal);
elem.appendChild(elemPeriod);
XMLNode firstChild = (XMLNode)xmlNode.getFirstChild();
// xmlNode пуст, если VO был пуст
if (firstChild != null){
XMLNode parent = (XMLNode)firstChild.getParentNode();
parent.appendChild(elem);
}else{
// добавляем элемент в корень
xmlNode.appendChild(elem);
}
3) Натягиваем данные на существующий шаблон XDOselect lb.file_data from xdo_templates_b tmp, xdo_lobs lb where tmp.template_code = :1 and tmp.application_short_name = :2 and lb.application_short_name = tmp.application_short_name and lb.lob_code = tmp.data_source_code and lb.lob_type = 'TEMPLATE' and sysdate between tmp.start_date and nvl(tmp.end_date,sysdate)4) Формируем выходной поток с помощью класса oracle.apps.xdo.template.FOProcessor
Шаблон для нашего отчета будет иметь особенности. Имя группы будет составлено как Имя_VO || 'Row'. Например, если VO отчета назывался ReportVO, то группа будет названа ReportVORow. Имена элементов будут совпадать с именами атрибутов VO. Отдельная группа - вручную добавленные параметры шапки:
<dataStructure> <group name="reportVORow" source="reportVORow"> <element name="ATTR1" value="ATTR1"/> <element name="ATTR2" value="ATTR2"/> ... <group name="ReportInfo" source="ReportInfo"> <element name="SomeParameter" value="SomeParameter"/> ...
23.04.2014
Загрузка и распарсивание файла xls с помощью Java-based concurrent
Цель: прочитать файл электронной таблицы Excel 95-2003 и загрузить результат в таблицу БД Oracle 11g. В нашем примере мы хотим прочитать данные из одной ячейки и положить их в таблицу create table HF_TMP (val VARCHAR2(50))
Алгоритм решения:
1. Загрузка файла через пользовательский интерфейс. Применяется messageFileUploadBean с типом данных BLOB.
При нажатии кнопки Загрузить происходит вставка записи в таблицу загрузок вместе с бинарным файлов Excel в blob-поле, присваивание upload_id и запуск Java-based канкарента, в который этот upload_id передается.
CO:2. Работа канкарента
Serializable[] aserializable = { uploadId }; Class[] aclass = { uploadId.getClass() }; String requestId = (String)am.invokeMethod("sendConcurrentRequest", aserializable, aclass); am.getTransaction().commit();AM:
public void sendConcurrentRequest(Number uploadId) throws RequestSubmissionException { ConcurrentRequest cpRequest = new ConcurrentRequest(this.getOADBTransaction().getJdbcConnection()); Vector requestParameters = new Vector(1); requestParameters.add(uploadId.stringValue()); int requestId = cpRequest.submitRequest(UploadHistFactBean.APPLICATION_SHORT_NAME, UploadHistFactBean.CONCURRENT_PROGRAM_NAME, null, null, false, requestParameters); }
// считываем BLOB
public InputStream getFileForUploadId(){
StringBuffer strBuf = new StringBuffer();
InputStream dataStream = null;
String lQuery = "select file_data from DATA_UPLOADS where request_id = :1";
String res = "";
try
{
OracleCallableStatement statement = (OracleCallableStatement)connection.prepareCall(lQuery);
statement.setInt(1, requestId);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
BLOB blob = ((OracleResultSet)resultSet).getBLOB(1);
dataStream = blob.getBinaryStream();
}
} catch (SQLException e)
{
throw OAException.wrapperException(e);
}
return dataStream;
} public void initialize(CpContext cpContext) throws SQLException,
XMLParseException,
SAXException,
IOException,
InstantiationException,
IllegalAccessException,
ClassNotFoundException,
NoSuchMethodException,
InvocationTargetException {
connection = cpContext.getJDBCConnection();
requestId = cpContext.getReqDetails().getRequestId();
logFile = cpContext.getLogFile();
reqCompletion = cpContext.getReqCompletion();
NameValueType parameter;
while (cpParameters.hasMoreElements()) {
parameter = cpParameters.nextParameter();
if ("p_upload_id".equalsIgnoreCase(parametr.getName())) {
this.uploadId = Integer.valueOf(parametr.getValue()).intValue();
}
}
public void runProgram(CpContext cpContext) {
try {
initialize(cpContext);
HashMap<String, String> inputParameters = new HashMap<String, String>();
inputParameters.put(DataInput.PARAMETER_PREFIX + "1", "oracle.apps.xxmy.test.bean.TemplateXML");
InputStream file = getFileForUploadId();
{ логика по распарсиванию файла Excel }
connection.commit();
// Успешно завершим конкаррент
Message normComplMessage = new Message("FND", "CONC-CP SUCCESSFUL TERMINATION");
reqCompletion.setCompletion(ReqCompletion.NORMAL, normComplMessage.getMessageText(cpContext.getResourceStore()));
} catch (Exception e) {
// Если произошла ошибка, нужно выставить конкаренту ошибочный статус и выдать в лог стек ошибки
reqCompletion.setCompletion(ReqCompletion.ERROR, e.getMessage());
StringWriter errStringWriter = new StringWriter();
PrintWriter errPrintWriter = new PrintWriter(errStringWriter, true);
e.printStackTrace(errPrintWriter);
logFile.writeln(errStringWriter.toString(), LogFile.ERROR);
} finally {
cpContext.releaseJDBCConnection();
}
}
3. Распарсивание XLS с помощью библиотеки POI. Шаблон oracle.apps.xxmy.test.bean.TemplateXML из шага 2 содержит набор параметров для вызова API вставки в таблицу с указанием данных о том, в каких ячейках брать значения. В нашем случае:<?xml version="1.0" encoding='windows-1251'?> <upload method="XXMY_TEST_PKG.upload_excel"> <element name="test" type="single"> <location src="sheet" sheet="Sheet1" row="0" col="0"/> </element> </upload>Пробегаясь по структуре данных и файлу данных, мы формируем вызов API:
begin XXMY_TEST_PKG.upload_excel(P_TEST => :1, P_REQUEST_ID => :2, P_UPLOAD_ID => :3, P_UPLOAD_METHOD => :4); end;Имея коллекции параметров и их значений, выполняем вызов:
public void doDbUpload() throws SQLException {
OracleCallableStatement statement = (OracleCallableStatement)connection.prepareCall(this.query);
ArrayList<Integer> keyList = new ArrayList<Integer>();
keyList.addAll(uploadParameters.keySet());
Collections.sort(keyList);
Iterator<Integer> parameterIterator = keyList.iterator();
while (parameterIterator.hasNext()) {
Integer parameterIndex = parameterIterator.next();
UploadParameter parameter = this.uploadParameters.get(parameterIndex);
statement.setString(parameterIndex.intValue(), parameter.getValue());
}
statement.execute();
statement.close();
}
Всё. Данные из файла отправляются в таблицу.09.09.2013
Канкарент на основе Java-класса
По шагам:
1. Создаем наш класс
1. Создаем наш класс
package oracle.apps.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import oracle.apps.fnd.common.Message;
import oracle.apps.fnd.cp.request.CpContext;
import oracle.apps.fnd.cp.request.JavaConcurrentProgram;
import oracle.apps.fnd.cp.request.LogFile;
import oracle.apps.fnd.cp.request.ReqCompletion;
public class MyJavaTest implements JavaConcurrentProgram {
public static final String APPLICATION_SHORT_NAME = "XXXX";
public static final String CONCURRENT_PROGRAM_NAME = "MY_CONC_PROGRAM";
private Connection connection;
private int requestId;
private LogFile logFile;
private ReqCompletion reqCompletion;
public void initialize(CpContext cpContext) throws SQLException,
XMLParseException,
SAXException,
IOException,
InstantiationException,
IllegalAccessException,
ClassNotFoundException,
NoSuchMethodException,
InvocationTargetException {
connection = cpContext.getJDBCConnection();
requestId = cpContext.getReqDetails().getRequestId();
logFile = cpContext.getLogFile();
reqCompletion = cpContext.getReqCompletion();
Enumeration params = cpContext.getReqDetails().getParaInfo().elements();
String Value = (String)params.nextElement();
int fileId = Integer.parseInt(Value);
// some code
}
public void runProgram(CpContext cpContext) {
try {
initialize(cpContext);
// some code
connection.commit();
// успешное заверщение канкарента
Message normComplMessage = new Message("FND", "CONC-CP SUCCESSFUL TERMINATION");
reqCompletion.setCompletion(ReqCompletion.NORMAL, normComplMessage.getMessageText(cpContext.getResourceStore()));
} catch (Exception e) {
reqCompletion.setCompletion(ReqCompletion.ERROR, e.getMessage());
StringWriter errStringWriter = new StringWriter();
PrintWriter errPrintWriter = new PrintWriter(errStringWriter, true);
e.printStackTrace(errPrintWriter);
logFile.writeln(errStringWriter.toString(), LogFile.ERROR);
} finally {
cpContext.releaseJDBCConnection();
}
}
}
2. Создаем канкарент26.03.2013
OAF: Атрибут VO как хинт к бину image
Возникла задача присвоить значкам типа image различные всплывающие подсказки из ViewObject. Один из вариантов реализации - через JavaScript.
11.03.2013
Использование JavaScript в OAF
Примеры использования JS в Oracle Applications Framework. Вызов JAVA-методов из кода JavaScript
20.11.2012
05.07.2012
OAF: изображение из BLOB
Имеем изображение, хранящееся в BLOB. Цель - положить его на страницу с помощью image bean.
