I get a NullPointerException as shown below when i run my job (who calling a service class):
Caused by NullPointerException: null
->> 184 | doCall in GrailsMelodyGrailsPlugin$_closure4_closure16_closure17
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 25 | doCall in ppf.ExportFichierService$_tt__lancerTraitements_closure3_closure4
| 23 | doCall in ppf.ExportFichierService$_$tt__lancerTraitements_closure3
| 12 | $tt__lancerTraitements in ppf.ExportFichierService
| 184 | doCall in GrailsMelodyGrailsPlugin$_closure4_closure16_closure17
| 13 | execute in ppf.ExportFichierJob
| 104 | execute in grails.plugins.quartz.GrailsJobFactory$GrailsJob
| 27 | execute in grails.plugins.quartz.QuartzDisplayJob
| 202 | run . . in org.quartz.core.JobRunShell
^ 573 | run in org.quartz.simpl.SimpleThreadPool$WorkerThread
package ppf
import grails.transaction.Transactional
#Transactional
class ExportFichierService extends FichierService {
def getPaiementsAExporter(def creancier) {}
def lancerTraitements() {
log.info "Entree dans la methode lancer traitement"
Creancier.fichierExportables.each { creancier ->
def instanceTypeFichier = [ new ExportFichierPaiementsOrdreService() ]
log.info "Instance de fichier:${instanceTypeFichier}"
if (creancier.deleted == false) {
log.info "${creancier.deleted}"
instanceTypeFichier.each { it ->
log.info "Instance: ${it}"
it.exporter(creancier)
}
}
}
}
}
def exporter(def creancier) {
def paiements = getPaiementsAExporter(creancier)
if (paiements.count() > 0) {
def fichierPaiementsOrdre = creationFichier(paiements, creancier)
exporterPaiements(fichierPaiementsOrdre, paiements)
sauvegarderFichier (fichierPaiementsOrdre, paiements, creancier)
}
}
Please help me to know why it can't call the method exporter properly
Finally i found the solution instead of putting instances like this [ new xxxService] i injected it and it works
Related
I'm trying to run GEB from a web-service on Grails since I need to extract data from a page and use it on my aplication.
The server is suposed to scrap the info and then return it into a view.
If I run it from the grails console it works fine but when I run it from the service it doesn't work
here's the code
package com.bamboozled
import geb.Browser
import grails.transaction.Transactional
#Transactional
class ScraperService {
Data scrapIt(String nombreCiclo, String numeroSolicitud) {
//Variable con los datos a retornar
def d = new Data()
//Inicia el bot
Browser.drive {
go "http://some.page/page.php"
$("form").ciclo = nombreCiclo
$("form").nosol = numeroSolicitud
$("form").find("input", name: "BOTONACEPTAR").click()
def a = getAvailableWindows()
def data = [" "," "," "," "," "]
withWindow(a[1]) {
data[0] = $("td")[5].text()
data[1] = $("td")[6].text()
data[2] = $("td")[7].text()
data[3] = $("td")[8].text()
data[4] = $("td")[9].text()
}
d.numeroSolicitud = data[0]
d.avance = data[1]
d.seEncuentraEn = data[2]
d.numeroCheque = data[3]
d.cheque = data[4]
}
return d
}
}
Here is the controller where I call it
package com.bamboozled
class DataController {
static scaffold = true
def ScraperService
def index() { }
def form() {
}
def consulta(){
def p = Ciclo.findAll()
[solicitudes : p]
}
def resultados() {
def d = ScraperService.scrapIt(params.nombreCiclo, params.numeroSolicitud)
[res : d]
}
}
When I run it it gives this error
URI
/bamboozled/data/resultados
Class
java.lang.NoClassDefFoundError
Message
geb/Browser
Around line 200 of PageFragmentCachingFilter.java
197: if (CollectionUtils.isEmpty(cacheOperations)) {
198: log.debug("No cacheable annotation found for {}:{} {}",
199: new Object[] { request.getMethod(), request.getRequestURI(), getContext() });
200: chain.doFilter(request, response);
201: return;
202: }
203:
Around line 63 of AbstractFilter.java
60: try {
61: // NO_FILTER set for RequestDispatcher forwards to avoid double gzipping
62: if (filterNotDisabled(request)) {
63: doFilter(request, response, chain);
64: }
65: else {
66: chain.doFilter(req, res);
Around line 17 of grails-app/services/com/bamboozled/ScraperService.groovy
14: def d = new Data()
15:
16: //Inicia el bot
17: Browser.drive {
18:
19: go "http://http://some.page/page.php"
20:
Around line 20 of grails-app/controllers/com/bamboozled/DataController.groovy
17: }
18:
19: def resultados() {
20: def d = ScraperService.scrapIt(params.nombreCiclo, params.numeroSolicitud)
21: [res : d]
22: }
23:
Trace
Line | Method
->> 200 | doFilter in PageFragmentCachingFilter.java
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 63 | doFilter in AbstractFilter.java
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 748 | run . . . in java.lang.Thread
Caused by ControllerExecutionException: Runtime error executing action
->> 200 | doFilter in PageFragmentCachingFilter.java
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 63 | doFilter in AbstractFilter.java
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 748 | run . . . in java.lang.Thread
Caused by InvocationTargetException: null
->> 200 | doFilter in PageFragmentCachingFilter.java
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 63 | doFilter in AbstractFilter.java
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 748 | run . . . in java.lang.Thread
Caused by NoClassDefFoundError: geb/Browser
->> 17 | $tt__scrapIt in ScraperService.groovy
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 20 | resultados in DataController.groovy
| 200 | doFilter in PageFragmentCachingFilter.java
| 63 | doFilter in AbstractFilter.java
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 748 | run . . . in java.lang.Thread
Any idea of how can I make it run?
I have an action that receives a file correctly and saves it to a destination folder without problems.
When the destination folder has a file with the same name, the method transferTo, first deletes the existing file, then copies the new one (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/multipart/commons/CommonsMultipartFile.html#transferTo-java.io.File-).
But if the destination file exists, Grails is throwing this error, and the existing file is deleted but the uploaded one is not copied.
I'm working in WinXP, so I don't think it is a permissions issues (the file is deleted so I guess has nothing to do with permissions).
| Error 2015-05-24 23:47:58,199 [http-bio-8090-exec-3] ERROR errors.GrailsExceptionResolver - FileNotFoundException occurred when processing request: [POST] /ehr/test/upload - parameters:
doit: upload
overwrite: true
SYNCHRONIZER_TOKEN: 8deaf46b-b6ff-4362-ac70-7223f37ae806
SYNCHRONIZER_URI: /ehr/test/upload
opts\Signos.opt (Access is denied). Stacktrace follows:
Message: opts\Signos.opt (Access is denied)
Line | Method
->> 221 | <init> in java.io.FileOutputStream
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 171 | <init> in ''
| 417 | write . . in org.apache.commons.fileupload.disk.DiskFileItem
| 85 | upload in test.TestController
| 198 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 744 | run . . . in java.lang.Thread
The upload action looks like:
def upload(boolean overwrite)
{
if (params.doit)
{
def errors = []
def f = request.getFile('opt')
def xml = new String( f.getBytes() )
def destination = config.opt_repo + f.getOriginalFilename()
File fileDest = new File( destination )
if (!overwrite && fileDest.exists())
{
errors << "The OPT already exists, do you want to overwrite?"
return [errors: errors, ask_overwrite: true]
}
// Some validation logic here ...
if (errors.size() == 0)
{
// http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/multipart/commons/CommonsMultipartFile.html#transferTo-java.io.File-
// If the file exists, it will be deleted first
f.transferTo(fileDest)
}
}
}
Inside my Applicant domain class I have the following:
static hasMany = [recommendationFiles:ApplicantFile]
static mapping = {recommendationFiles joinTable: [name:"LETTER_FILES", key: "APPLICANT_ID", column: "LETTER_ID"]}
When I do the following:
def applicant = Applicant.findByENumber(session.user.eNumber)
def applicantFiles = applicant.recommendationFiles
println applicantFiles
applicantFiles.each {
applicant.removeFromRecommendationFiles(it)
}
applicant.save(flush:true)
I get this as an error which makes no sense to me:
| Error 2015-04-08 10:41:59,570 [http-bio-8080-exec-10] ERROR errors.GrailsExceptionResolver - ConcurrentModificationException occurred when processi
ng request: [POST] /scholarshipsystem/specialized/index - parameters:
_action_reUpload: Re-Upload
Stacktrace follows:
Message: null
Line | Method
->> 793 | nextEntry in java.util.HashMap$HashIterator
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 828 | next in java.util.HashMap$KeyIterator
| 106 | reUpload in scholarshipSystem.SpecializedController$$EP9HMKbd
| 195 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 895 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 918 | run . . . in ''
^ 662 | run in java.lang.Thread
There's a few ways to make this work. One way is to convert the list to an array and iterate over it.
def list = applicantFiles.toArray()
list.each {
applicant.removeFromRecommendationFiles(it)
}
Another way, if you're just removing the entire collection would be to...
applicant.recommendationFiles*.delete()
applicant.recommendationFiles.clear()
I have this function which returns two integers and a boolean in a Service class:
def setEntityRecordBalance(EntityRecord entRec, Map params) {
float totalBalance = 0
int redIssues = 0, yellowIssues = 0
boolean insured = false
/* For each account owned by this entity, get its figure in USD and then add to running total. */
if (entRec.accounts == []) {
redIssues++
setCleanFlag(entRec.redIssues, 'No accounts found.')
return [redIssues, yellowIssues]
}
else {
entRec.accounts.each {
def account = AccountRecord.findWhere(uniqueId: it.uniqueId, accountId: it.accountId,
batchID: params.selectedBatch.id)
if (account.amount == null)
totalBalance += 0
else
if (account.currencyType == null || account.currencyType.equalsIgnoreCase('USD'))
totalBalance += account.amount
else
totalBalance += getUSDamount(account)
if (account.insurance != null && (account.insurance.equalsIgnoreCase('Y') || account.insurance.equalsIgnoreCase('YES')))
insured = true
}
}
entRec.balance = totalBalance
return [redIssues, yellowIssues, insured]
}
Now, in the same Service class, I have another statement in a function that call this function like this:
def (redFlags, yellowFlags, insured) = setEntityRecordBalance(newEntityRecord, params)
println "<><><> Value of insured: " + insured + " " + redFlags + " " + yellowFlags
def (redFlgs, yellowFlgs, isReportable) = setEntityRecordBalanceFlags (newEntityRecord, insured)
I get the two integers but the boolean comes back as null, why?
This is the error I get:
<><><> Value of insured: null 1 0
| Error 2014-08-16 18:34:34,857 [http-bio-8080-exec-10] ERROR errors.GrailsExceptionResolver - MissingMethodException occurred when processing request: [POST] /FatcaOne_0/customer/saveNewEntityRecord - parameters:
status:
entityJurisdiction:
countryCode:
taxIdNumber:
uniqueId: 123
entityName: asdf
generalComments:
secondaryId: 234
address:
subStatus:
cityTown:
telephone:
giin:
No signature of method: com.twc.fatcaone.FileImportService.setEntityRecordBalanceFlags() is applicable for argument types: (com.twc.fatcaone.EntityRecord, null) values: [com.twc.fatcaone.EntityRecord : (unsaved), ...]
Possible solutions: setEntityRecordBalanceFlags(com.twc.fatcaone.EntityRecord, boolean). Stacktrace follows:
Message: No signature of method: com.twc.fatcaone.FileImportService.setEntityRecordBalanceFlags() is applicable for argument types: (com.twc.fatcaone.EntityRecord, null) values: [com.twc.fatcaone.EntityRecord : (unsaved), ...]
Possible solutions: setEntityRecordBalanceFlags(com.twc.fatcaone.EntityRecord, boolean)
Line | Method
->> 1672 | $tt__createNewEntityRecord in com.twc.fatcaone.FileImportService$$EOn7yRsm
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 323 | saveNewEntityRecord in com.twc.fatcaone.CustomerController$$EOn7xmG8
| 198 | doFilter . . . . . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1145 | runWorker . . . . . . . . in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 744 | run . . . . . . . . . . . in java.lang.Thread
Because here
return [redIssues, yellowIssues]
You only return 2 elements, with no third boolean
I see that this error message has been posted several times already in the context of hibernate.
I am getting this error while using grails service and a domain class, any help will be really appreciated
Domain class
class Coupon {
Date dateCreated
Date lastUpdated
String code
String email
String address
String state
String city
String zip
def couponCodeGeneratorService
def beforeValidate() {
println code+"---------8-"
code = couponCodeGeneratorService.generate()
println code+"----------"
}
static constraints = {
email blank:false,email:true
address blank:false
state blank:false
city blank:false
zip blank:false
}
}
Service
class CouponCodeGeneratorService {
Random randomGenerator = new Random()
def serviceMethod() {
}
def generate(){
def group1 = randomGenerator.nextInt(9999)+"";
def group2 = randomGenerator.nextInt(9999)+"";
def group3 = randomGenerator.nextInt(9999)+"";
def group4 = randomGenerator.nextInt(9999)+"";
return group1.padLeft(4,"0") +group2.padLeft(4,"0")+group3.padLeft(4,"0")+group4.padLeft(4,"0")
}
}
The error I am getting is
---------8-
4844634041715590----------
4844634041715590---------8-
| Error 2012-09-10 11:32:54,938 [http-bio-8080-exec-7] ERROR hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
Message: null id in com.easytha.Coupon entry (don't flush the Session after an exception occurs)
Line | Method
->> 19 | beforeValidate in com.easytha.Coupon
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 46 | onApplicationEvent in org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
| 24 | save . . . . . . . in com.easytha.CouponController
| 186 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter . . . . . in grails.plugin.cache.web.filter.AbstractFilter
| 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run . . . . . . . in ''
^ 662 | run in java.lang.Thread
| Error 2012-09-10 11:32:54,944 [http-bio-8080-exec-7] ERROR errors.GrailsExceptionResolver - AssertionFailure occurred when processing request: [POST] /EasyTha/coupon/save - parameters:
zip: asdf
address: asd
email: s.s#s.xom
state: asd
code:
create: Create
city: asdf
null id in com.easytha.Coupon entry (don't flush the Session after an exception occurs). Stacktrace follows:
Message: null id in com.easytha.Coupon entry (don't flush the Session after an exception occurs)
Line | Method
->> 19 | beforeValidate in com.easytha.Coupon
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 46 | onApplicationEvent in org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
| 24 | save . . . . . . . in com.easytha.CouponController
| 186 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter . . . . . in grails.plugin.cache.web.filter.AbstractFilter
| 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run . . . . . . . in ''
^ 662 | run in java.lang.Thread
I am not very familiar with Hibernate, also is this a correct way to create a coupon code that looks like a credit card number?
I suspect the problem may be that the CouponCodeGeneratorService is transactional. Therefore, when you call the service method from inside your beforeValidate you're opening and closing a transaction (even though you don't touch the database inside the method), which among other things will cause another flush of the session.
Try making the service non-transactional:
static transactional = false