Skip to content

Troubleshooting

Common problems and how to fix them, grouped by when they happen.

Startup

Problem Fix
Configure spring.jpa.admin.security.username and spring.jpa.admin.security.password Set a non-blank password, for example password: ${ADMIN_PASSWORD}, and provide ADMIN_PASSWORD.
spring.jpa.admin.path must start with '/', have no trailing slash… Use a value like /admin or /backoffice, not admin/, /admin/ or /.
@AdminUpload fields reference storages that aren't configured: Product.imageUrl uses storage "default" Add spring.jpa.admin.storage.default (or the named storage). See File uploads.
… uses type s3, which needs the dependency software.amazon.awssdk:s3 Add the AWS SDK s3 dependency.
spring.jpa.admin.storage.<name>.public-key is required for type imagekit Fill in the provider settings listed in the message.
@AdminUpload on X.y requires a String field Use a String field that stores the file URL.
Invalid @AdminUpload maxSize "5 megs" Use 500KB, 5MB or 1GB.
Could not find artifact … in central Check the Central coordinates and publication status, then retry with -U (Installation).

Signing in and access

Problem Fix
The console page is blank or 404 Open {path}/ with the trailing slash, for example /admin/. Check that spring.jpa.admin.enabled isn't false and that the app is a servlet web application.
"Invalid username or password" Check the values in effect; environment variables override application.yml. Restart after changing them.
"Your session has expired" Sign in again. Behind several instances, use sticky sessions or Spring Session.
403 on saves from scripts Send the CSRF header from /auth/session with the session cookie. Fetch a fresh token after signing in, because the session rotates.
Another security chain intercepts the API The admin chain has order -100 and matches {path}/api/**. Make sure your own chains don't claim that path first.

Data

Problem Fix
An entity is missing It must be a JPA @Entity in your EntityManagerFactory (check @EntityScan) and not @AdminResource(hidden = true).
A field is missing from forms Check inForm; generated IDs, computed values and one-to-many collections without @AdminInline aren't in forms.
Search finds nothing Search covers text fields marked searchable = true, or all text fields if none are marked.
A filter isn't offered Mark the field filterable = true.
"Invalid filter value for Price" The URL has a filter value of the wrong type; remove the chip or fix the value.
"This change conflicts with existing data" (409) A unique value is already used, or the record is still referenced by another record.
"The selected record no longer exists" The related record was deleted; choose another.
A custom action fails Use a no-argument instance method or a static method taking one List; injected parameters aren't supported.
Sample data disappeared The sample's H2 database is in memory and resets on restart.

Uploads

Problem Fix
"Couldn't reach the file storage … (CORS)" Add a CORS rule to the bucket that allows PUT from the admin's origin (S3 CORS).
"The file's content doesn't match its type" The file isn't what its extension says (for example, a renamed HTML file). Export it in a real image or PDF format.
"isn't an allowed file type" or "the limit is 5 MB" Adjust accept / maxSize on @AdminUpload, or choose another file.
"The upload took too long. Please try again." The 30-minute ticket expired. Upload again.
"Invalid upload ticket" (several instances) Set the same upload.signing-key on every instance.
Uploaded images don't show For local storage, check that public-path isn't blocked by your own security rules. For S3, check that the objects are publicly readable or set public-url to a CDN.

UI and builds

Problem Fix
UI changes don't appear in the JAR Rebuild with ./mvnw package (or npm run build in jpa-admin-ui) and restart. JitPack builds use the committed jpa-admin-ui/dist.
npm not found during the Maven build Install Node.js 20+ and run npm ci --prefix jpa-admin-ui, or build with -DskipNpmBuild=true to reuse the committed dist.
Saved views or hidden columns are gone They're stored per browser; clearing site data removes them.
Port 8080 is busy Start with --server.port=8081.