theonedev/onedev · warning · NoSubscriptionException

Project level issue state transition rule definition

Error message

Project level issue state transition rule definition

What it means

The project-level issue state transition rules setting page is a premium feature; the constructor checks WicketUtils.isSubscriptionActive() and throws NoSubscriptionException when no active OneDev subscription exists. The feature is gated behind a paid plan.

Source

Thrown at server-core/src/main/java/io/onedev/server/web/page/project/setting/issuesetting/ProjectStateTransitionListPage.java:27

import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import io.onedev.server.OneDev;
import io.onedev.server.data.migration.VersionedXmlDoc;
import io.onedev.server.exception.NoSubscriptionException;
import io.onedev.server.model.support.issue.transitionspec.TransitionSpec;
import io.onedev.server.service.ProjectService;
import io.onedev.server.util.CollectionUtils;
import io.onedev.server.web.component.issue.transitionspec.StateTransitionListPanel;
import io.onedev.server.web.util.WicketUtils;

public class ProjectStateTransitionListPage extends ProjectIssueSettingPage {

	public ProjectStateTransitionListPage(PageParameters params) {
		super(params);

		if (!WicketUtils.isSubscriptionActive()) {
			throw new NoSubscriptionException("Project level issue state transition rule definition");
		}
	}

	@Override
	protected void onInitialize() {
		super.onInitialize();
		
		add(new StateTransitionListPanel("transitions") {
			
			@Override
			protected List<TransitionSpec> getTransitions() {
				return getProject().getIssueSetting().getTransitionSpecs();
			}
			
			@Override
			protected void onSave(AjaxRequestTarget target, int transitionIndex, TransitionSpec transition) {
				String oldAuditContent = null;
				List<TransitionSpec> transitions = getProject().getIssueSetting().getTransitionSpecs();

View on GitHub (pinned to d44925c47c)

Solutions

  1. Purchase or renew a OneDev subscription and apply the license key on the server (Site Settings / subscription).
  2. Use the free alternative: define state transitions via project issue setting that is available in community (e.g. rules at the global level if offered) or manage states manually.
  3. If a subscription was recently applied, restart/refresh so the license check picks it up.
Defensive patterns

Strategy: validation

Validate before calling

if (!WicketUtils.isSubscriptionActive()) {
    // hide the state transitions menu entry / redirect to subscription page
    throw new NoSubscriptionException("State transition rules require an active subscription");
}

Type guard

boolean canManageStateTransitions() { return WicketUtils.isSubscriptionActive(); }

Try / catch

try { openStateTransitionsPage(project); } catch (NoSubscriptionException e) { promptSubscriptionUpgrade(); }

Prevention

When it happens

Trigger: Opening Project -> Issue Settings -> State Transitions while running community edition or with an expired/absent subscription key.

Common situations: Using OneDev community build after evaluating premium features; subscription expired; license key not applied on the instance; sharing settings documentation that assumes enterprise edition.

Related errors


AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06). Data as JSON: /api/errors/0c6a5fca92501f06. Report an issue: GitHub.