[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M79P76BGSWVFS27KPD2067ZD":3,"skill-same:01M79P76BGSWVFS27KPD2067ZD":47},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":14,"repositoryHtmlUrl":29,"repositoryHomepageUrl":6,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M79P76BGSWVFS27KPD2067ZD","java-coding-standards",null,"Java coding standards for Spring Boot and Quarkus services: naming, immutability, Optional usage, streams, exceptions, generics, CDI, reactive patterns, and project layout. Automatically applies framework-specific conventions. Use when writing or reviewing Java in a Spring Boot or Quarkus service.","JunMystery\u002FAgent-Guidance","JunMystery","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F161468934?v=4","01M79MTMV8F0BY8NK1A92RA8A0","Jun","01M79MTMWCFBKPHN5B25E6V20B",0,"MIT","https:\u002F\u002Fgithub.com\u002FJunMystery\u002FAgent-Guidance\u002Fblob\u002Fmain\u002Fskills\u002Fjava-coding-standards\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: java-coding-standards\ndescription: \"Java coding standards for Spring Boot and Quarkus services: naming, immutability, Optional usage, streams, exceptions, generics, CDI, reactive patterns, and project layout. Automatically applies framework-specific conventions. Use when writing or reviewing Java in a Spring Boot or Quarkus service.\"\nmetadata:\n  origin: ECC\n---\n\n# Java Coding Standards\n\nStandards for readable, maintainable Java (17+) code in Spring Boot and Quarkus services.\n\n## When to Use\n\n- Writing or reviewing Java code in Spring Boot or Quarkus projects\n- Enforcing naming, immutability, or exception handling conventions\n- Working with records, sealed classes, or pattern matching (Java 17+)\n- Reviewing use of Optional, streams, or generics\n- Structuring packages and project layout\n- **[QUARKUS]**: Working with CDI scopes, Panache entities, or reactive pipelines\n\n## How It Works\n\n### Framework Detection\n\nBefore applying standards, determine the framework from the build file:\n\n- Build file contains `quarkus` → apply **[QUARKUS]** conventions\n- Build file contains `spring-boot` → apply **[SPRING]** conventions\n- Neither detected → apply shared conventions only\n\n## Core Principles\n\n- Prefer clarity over cleverness\n- Immutable by default; minimize shared mutable state\n- Fail fast with meaningful exceptions\n- Consistent naming and package structure\n- **[QUARKUS]**: Favor build-time over runtime processing; avoid runtime reflection where possible\n\n## Examples\n\nThe sections below show concrete Spring Boot, Quarkus, and shared Java examples\nfor naming, immutability, dependency injection, reactive code, exceptions,\nproject layout, logging, configuration, and tests.\n\n## Naming\n\n```java\n\u002F\u002F PASS: Classes\u002FRecords: PascalCase\npublic class MarketService {}\npublic record Money(BigDecimal amount, Currency currency) {}\n\n\u002F\u002F PASS: Methods\u002Ffields: camelCase\nprivate final MarketRepository marketRepository;\npublic Market findBySlug(String slug) {}\n\n\u002F\u002F PASS: Constants: UPPER_SNAKE_CASE\nprivate static final int MAX_PAGE_SIZE = 100;\n\n\u002F\u002F PASS: [QUARKUS] JAX-RS resources named as *Resource, not *Controller\npublic class MarketResource {}\n\n\u002F\u002F PASS: [SPRING] REST controllers named as *Controller\npublic class MarketController {}\n```\n\n## Immutability\n\n```java\n\u002F\u002F PASS: Favor records and final fields\npublic record MarketDto(Long id, String name, MarketStatus status) {}\n\npublic class Market {\n  private final Long id;\n  private final String name;\n  \u002F\u002F getters only, no setters\n}\n\n\u002F\u002F PASS: [QUARKUS] Panache active-record entities use public fields (Quarkus convention)\n@Entity\npublic class Market extends PanacheEntity {\n  public String name;\n  public MarketStatus status;\n  \u002F\u002F Panache generates accessors at build time; public fields are idiomatic here\n}\n\n\u002F\u002F PASS: [QUARKUS] Panache MongoDB entities\n@MongoEntity(collection = \"markets\")\npublic class Market extends PanacheMongoEntity {\n  public String name;\n  public MarketStatus status;\n}\n```\n\n## Optional Usage\n\n```java\n\u002F\u002F PASS: Return Optional from find* methods\n\u002F\u002F [SPRING]\nOptional\u003CMarket> market = marketRepository.findBySlug(slug);\n\n\u002F\u002F [QUARKUS] Panache\nOptional\u003CMarket> market = Market.find(\"slug\", slug).firstResultOptional();\n\n\u002F\u002F PASS: Map\u002FflatMap instead of get()\nreturn market\n    .map(MarketResponse::from)\n    .orElseThrow(() -> new EntityNotFoundException(\"Market not found\"));\n```\n\n## Streams Best Practices\n\n```java\n\u002F\u002F PASS: Use streams for transformations, keep pipelines short\nList\u003CString> names = markets.stream()\n    .map(Market::name)\n    .filter(Objects::nonNull)\n    .toList();\n\n\u002F\u002F FAIL: Avoid complex nested streams; prefer loops for clarity\n```\n\n## Dependency Injection\n\n```java\n\u002F\u002F PASS: [SPRING] Constructor injection (preferred over @Autowired on fields)\n@Service\npublic class MarketService {\n  private final MarketRepository marketRepository;\n\n  public MarketService(MarketRepository marketRepository) {\n    this.marketRepository = marketRepository;\n  }\n}\n\n\u002F\u002F PASS: [QUARKUS] Constructor injection\n@ApplicationScoped\npublic class MarketService {\n  private final MarketRepository marketRepository;\n\n  @Inject\n  public MarketService(MarketRepository marketRepository) {\n    this.marketRepository = marketRepository;\n  }\n}\n\n\u002F\u002F PASS: [QUARKUS] Package-private field injection (acceptable in Quarkus — avoids proxy issues)\n@ApplicationScoped\npublic class MarketService {\n  @Inject\n  MarketRepository marketRepository;\n}\n\n\u002F\u002F FAIL: [SPRING] Field injection with @Autowired\n@Autowired\nprivate MarketRepository marketRepository; \u002F\u002F use constructor injection\n\n\u002F\u002F FAIL: [QUARKUS] @Singleton when interception or lazy init is needed\n@Singleton \u002F\u002F non-proxyable — use @ApplicationScoped instead\npublic class MarketService {}\n```\n\n## Reactive Patterns [QUARKUS]\n\n```java\n\u002F\u002F PASS: Return Uni\u002FMulti from reactive endpoints\n@GET\n@Path(\"\u002F{slug}\")\npublic Uni\u003CMarket> findBySlug(@PathParam(\"slug\") String slug) {\n  return Market.find(\"slug\", slug)\n      .\u003CMarket>firstResult()\n      .onItem().ifNull().failWith(() -> new MarketNotFoundException(slug));\n}\n\n\u002F\u002F PASS: Non-blocking pipeline composition\npublic Uni\u003COrderConfirmation> placeOrder(OrderRequest req) {\n  return validateOrder(req)\n      .chain(valid -> persistOrder(valid))\n      .chain(order -> notifyFulfillment(order));\n}\n\n\u002F\u002F FAIL: Blocking call inside a Uni\u002FMulti pipeline\npublic Uni\u003CMarket> find(String slug) {\n  Market m = Market.find(\"slug\", slug).firstResult(); \u002F\u002F BLOCKING — breaks event loop\n  return Uni.createFrom().item(m);\n}\n\n\u002F\u002F FAIL: Subscribing more than once to a shared Uni\nUni\u003CMarket> shared = fetchMarket(slug);\nshared.subscribe().with(m -> log(m));\nshared.subscribe().with(m -> cache(m)); \u002F\u002F double subscribe — use Uni.memoize()\n```\n\n## Exceptions\n\n- Use unchecked exceptions for domain errors; wrap technical exceptions with context\n- Create domain-specific exceptions (e.g., `MarketNotFoundException`)\n- Avoid broad `catch (Exception ex)` unless rethrowing\u002Flogging centrally\n\n```java\nthrow new MarketNotFoundException(slug);\n```\n\n### Centralised Exception Handling\n\n```java\n\u002F\u002F [SPRING]\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n  @ExceptionHandler(MarketNotFoundException.class)\n  public ResponseEntity\u003CErrorResponse> handle(MarketNotFoundException ex) {\n    return ResponseEntity.status(404).body(ErrorResponse.from(ex));\n  }\n}\n\n\u002F\u002F [QUARKUS] Option A: ExceptionMapper\n@Provider\npublic class MarketNotFoundMapper implements ExceptionMapper\u003CMarketNotFoundException> {\n  @Override\n  public Response toResponse(MarketNotFoundException ex) {\n    return Response.status(404).entity(ErrorResponse.from(ex)).build();\n  }\n}\n\n\u002F\u002F [QUARKUS] Option B: @ServerExceptionMapper (RESTEasy Reactive)\n@ServerExceptionMapper\npublic RestResponse\u003CErrorResponse> handle(MarketNotFoundException ex) {\n  return RestResponse.status(Status.NOT_FOUND, ErrorResponse.from(ex));\n}\n```\n\n## Generics and Type Safety\n\n- Avoid raw types; declare generic parameters\n- Prefer bounded generics for reusable utilities\n\n```java\npublic \u003CT extends Identifiable> Map\u003CLong, T> indexById(Collection\u003CT> items) { ... }\n```\n\n## Project Structure\n\n### [SPRING] Maven\u002FGradle\n\n```\nsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fapp\u002F\n  config\u002F\n  controller\u002F\n  service\u002F\n  repository\u002F\n  domain\u002F\n  dto\u002F\n  util\u002F\nsrc\u002Fmain\u002Fresources\u002F\n  application.yml\nsrc\u002Ftest\u002Fjava\u002F... (mirrors main)\n```\n\n### [QUARKUS] Maven\u002FGradle\n\n```\nsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fapp\u002F\n  config\u002F              # @ConfigMapping, @ConfigProperty beans, Producers\n  resource\u002F            # JAX-RS resources (not \"controller\")\n  service\u002F\n  repository\u002F          # PanacheRepository implementations (if not using active record)\n  domain\u002F              # JPA\u002FPanache entities, MongoDB entities\n  dto\u002F\n  util\u002F\n  mapper\u002F              # MapStruct mappers (if used)\nsrc\u002Fmain\u002Fresources\u002F\n  application.properties   # Quarkus convention (YAML supported with quarkus-config-yaml)\n  import.sql               # Hibernate auto-import for dev\u002Ftest\nsrc\u002Ftest\u002Fjava\u002F... (mirrors main)\n```\n\n## Formatting and Style\n\n- Use 2 or 4 spaces consistently (project standard)\n- One public top-level type per file\n- Keep methods short and focused; extract helpers\n- Order members: constants, fields, constructors, public methods, protected, private\n\n## Code Smells to Avoid\n\n- Long parameter lists → use DTO\u002Fbuilders\n- Deep nesting → early returns\n- Magic numbers → named constants\n- Static mutable state → prefer dependency injection\n- Silent catch blocks → log and act or rethrow\n- **[QUARKUS]**: `@Singleton` where `@ApplicationScoped` is intended — breaks proxying and interception\n- **[QUARKUS]**: Mixing `quarkus-resteasy-reactive` and `quarkus-resteasy` (classic) — pick one stack\n- **[QUARKUS]**: Panache active-record + repository pattern in the same bounded context — pick one\n\n## Logging\n\n```java\n\u002F\u002F [SPRING] SLF4J\nprivate static final Logger log = LoggerFactory.getLogger(MarketService.class);\nlog.info(\"fetch_market slug={}\", slug);\nlog.error(\"failed_fetch_market slug={}\", slug, ex);\n\n\u002F\u002F [QUARKUS] JBoss Logging (default, zero-cost at build time)\nprivate static final Logger log = Logger.getLogger(MarketService.class);\nlog.infof(\"fetch_market slug=%s\", slug);\nlog.errorf(ex, \"failed_fetch_market slug=%s\", slug);\n\n\u002F\u002F [QUARKUS] Alternative: simplified logging with @Inject\n@Inject\nLogger log; \u002F\u002F CDI-injected, scoped to declaring class\n```\n\n## Null Handling\n\n- Accept `@Nullable` only when unavoidable; otherwise use `@NonNull`\n- Use Bean Validation (`@NotNull`, `@NotBlank`) on inputs\n- **[QUARKUS]**: Apply `@Valid` on `@BeanParam`, `@RestForm`, and request body parameters\n\n## Configuration\n\n```java\n\u002F\u002F [SPRING] @ConfigurationProperties\n@ConfigurationProperties(prefix = \"market\")\npublic record MarketProperties(int maxPageSize, Duration cacheTtl) {}\n\n\u002F\u002F [QUARKUS] @ConfigMapping (type-safe, build-time validated)\n@ConfigMapping(prefix = \"market\")\npublic interface MarketConfig {\n  int maxPageSize();\n  Duration cacheTtl();\n}\n\n\u002F\u002F [QUARKUS] Simple values with @ConfigProperty\n@ConfigProperty(name = \"market.max-page-size\", defaultValue = \"100\")\nint maxPageSize;\n```\n\n## Testing Expectations\n\n### Shared\n- JUnit 5 + AssertJ for fluent assertions\n- Mockito for mocking; avoid partial mocks where possible\n- Favor deterministic tests; no hidden sleeps\n\n### [SPRING]\n- `@WebMvcTest` for controller slices, `@DataJpaTest` for repository slices\n- `@SpringBootTest` reserved for full integration tests\n- `@MockBean` for replacing beans in Spring context\n\n### [QUARKUS]\n- Plain JUnit 5 + Mockito for unit tests (no `@QuarkusTest`)\n- `@QuarkusTest` reserved for CDI integration tests\n- `@InjectMock` for replacing CDI beans in integration tests\n- Dev Services for database\u002FKafka\u002FRedis — avoid manual Testcontainers setup when Dev Services suffice\n- `@QuarkusTestResource` for custom external service lifecycle\n\n```java\n\u002F\u002F [SPRING] Controller test\n@WebMvcTest(MarketController.class)\nclass MarketControllerTest {\n  @Autowired MockMvc mockMvc;\n  @MockBean MarketService marketService;\n}\n\n\u002F\u002F [QUARKUS] Integration test\n@QuarkusTest\nclass MarketResourceTest {\n  @InjectMock\n  MarketService marketService;\n\n  @Test\n  void should_return_404_when_market_not_found() {\n    given().when().get(\"\u002Fmarkets\u002Funknown\").then().statusCode(404);\n  }\n}\n\n\u002F\u002F [QUARKUS] Unit test (no CDI, no @QuarkusTest)\n@ExtendWith(MockitoExtension.class)\nclass MarketServiceTest {\n  @Mock MarketRepository marketRepository;\n  @InjectMocks MarketService marketService;\n}\n```\n\n**Remember**: Keep code intentional, typed, and observable. Optimize for maintainability over micro-optimizations unless proven necessary.\n","# Java Coding Standards\n\nStandards for readable, maintainable Java (17+) code in Spring Boot and Quarkus services.\n\n## When to Use\n\n- Writing or reviewing Java code in Spring Boot or Quarkus projects\n- Enforcing naming, immutability, or exception handling conventions\n- Working with records, sealed classes, or pattern matching (Java 17+)\n- Reviewing use of Optional, streams, or generics\n- Structuring packages and project layout\n- **[QUARKUS]**: Working with CDI scopes, Panache entities, or reactive pipelines\n\n## How It Works\n\n### Framework Detection\n\nBefore applying standards, determine the framework from the build file:\n\n- Build file contains `quarkus` → apply **[QUARKUS]** conventions\n- Build file contains `spring-boot` → apply **[SPRING]** conventions\n- Neither detected → apply shared conventions only\n\n## Core Principles\n\n- Prefer clarity over cleverness\n- Immutable by default; minimize shared mutable state\n- Fail fast with meaningful exceptions\n- Consistent naming and package structure\n- **[QUARKUS]**: Favor build-time over runtime processing; avoid runtime reflection where possible\n\n## Examples\n\nThe sections below show concrete Spring Boot, Quarkus, and shared Java examples\nfor naming, immutability, dependency injection, reactive code, exceptions,\nproject layout, logging, configuration, and tests.\n\n## Naming\n\n```java\n\u002F\u002F PASS: Classes\u002FRecords: PascalCase\npublic class MarketService {}\npublic record Money(BigDecimal amount, Currency currency) {}\n\n\u002F\u002F PASS: Methods\u002Ffields: camelCase\nprivate final MarketRepository marketRepository;\npublic Market findBySlug(String slug) {}\n\n\u002F\u002F PASS: Constants: UPPER_SNAKE_CASE\nprivate static final int MAX_PAGE_SIZE = 100;\n\n\u002F\u002F PASS: [QUARKUS] JAX-RS resources named as *Resource, not *Controller\npublic class MarketResource {}\n\n\u002F\u002F PASS: [SPRING] REST controllers named as *Controller\npublic class MarketController {}\n```\n\n## Immutability\n\n```java\n\u002F\u002F PASS: Favor records and final fields\npublic record MarketDto(Long id, String name, MarketStatus status) {}\n\npublic class Market {\n  private final Long id;\n  private final String name;\n  \u002F\u002F getters only, no setters\n}\n\n\u002F\u002F PASS: [QUARKUS] Panache active-record entities use public fields (Quarkus convention)\n@Entity\npublic class Market extends PanacheEntity {\n  public String name;\n  public MarketStatus status;\n  \u002F\u002F Panache generates accessors at build time; public fields are idiomatic here\n}\n\n\u002F\u002F PASS: [QUARKUS] Panache MongoDB entities\n@MongoEntity(collection = \"markets\")\npublic class Market extends PanacheMongoEntity {\n  public String name;\n  public MarketStatus status;\n}\n```\n\n## Optional Usage\n\n```java\n\u002F\u002F PASS: Return Optional from find* methods\n\u002F\u002F [SPRING]\nOptional\u003CMarket> market = marketRepository.findBySlug(slug);\n\n\u002F\u002F [QUARKUS] Panache\nOptional\u003CMarket> market = Market.find(\"slug\", slug).firstResultOptional();\n\n\u002F\u002F PASS: Map\u002FflatMap instead of get()\nreturn market\n    .map(MarketResponse::from)\n    .orElseThrow(() -> new EntityNotFoundException(\"Market not found\"));\n```\n\n## Streams Best Practices\n\n```java\n\u002F\u002F PASS: Use streams for transformations, keep pipelines short\nList\u003CString> names = markets.stream()\n    .map(Market::name)\n    .filter(Objects::nonNull)\n    .toList();\n\n\u002F\u002F FAIL: Avoid complex nested streams; prefer loops for clarity\n```\n\n## Dependency Injection\n\n```java\n\u002F\u002F PASS: [SPRING] Constructor injection (preferred over @Autowired on fields)\n@Service\npublic class MarketService {\n  private final MarketRepository marketRepository;\n\n  public MarketService(MarketRepository marketRepository) {\n    this.marketRepository = marketRepository;\n  }\n}\n\n\u002F\u002F PASS: [QUARKUS] Constructor injection\n@ApplicationScoped\npublic class MarketService {\n  private final MarketRepository marketRepository;\n\n  @Inject\n  public MarketService(MarketRepository marketRepository) {\n    this.marketRepository = marketRepository;\n  }\n}\n\n\u002F\u002F PASS: [QUARKUS] Package-private field injection (acceptable in Quarkus — avoids proxy issues)\n@ApplicationScoped\npublic class MarketService {\n  @Inject\n  MarketRepository marketRepository;\n}\n\n\u002F\u002F FAIL: [SPRING] Field injection with @Autowired\n@Autowired\nprivate MarketRepository marketRepository; \u002F\u002F use constructor injection\n\n\u002F\u002F FAIL: [QUARKUS] @Singleton when interception or lazy init is needed\n@Singleton \u002F\u002F non-proxyable — use @ApplicationScoped instead\npublic class MarketService {}\n```\n\n## Reactive Patterns [QUARKUS]\n\n```java\n\u002F\u002F PASS: Return Uni\u002FMulti from reactive endpoints\n@GET\n@Path(\"\u002F{slug}\")\npublic Uni\u003CMarket> findBySlug(@PathParam(\"slug\") String slug) {\n  return Market.find(\"slug\", slug)\n      .\u003CMarket>firstResult()\n      .onItem().ifNull().failWith(() -> new MarketNotFoundException(slug));\n}\n\n\u002F\u002F PASS: Non-blocking pipeline composition\npublic Uni\u003COrderConfirmation> placeOrder(OrderRequest req) {\n  return validateOrder(req)\n      .chain(valid -> persistOrder(valid))\n      .chain(order -> notifyFulfillment(order));\n}\n\n\u002F\u002F FAIL: Blocking call inside a Uni\u002FMulti pipeline\npublic Uni\u003CMarket> find(String slug) {\n  Market m = Market.find(\"slug\", slug).firstResult(); \u002F\u002F BLOCKING — breaks event loop\n  return Uni.createFrom().item(m);\n}\n\n\u002F\u002F FAIL: Subscribing more than once to a shared Uni\nUni\u003CMarket> shared = fetchMarket(slug);\nshared.subscribe().with(m -> log(m));\nshared.subscribe().with(m -> cache(m)); \u002F\u002F double subscribe — use Uni.memoize()\n```\n\n## Exceptions\n\n- Use unchecked exceptions for domain errors; wrap technical exceptions with context\n- Create domain-specific exceptions (e.g., `MarketNotFoundException`)\n- Avoid broad `catch (Exception ex)` unless rethrowing\u002Flogging centrally\n\n```java\nthrow new MarketNotFoundException(slug);\n```\n\n### Centralised Exception Handling\n\n```java\n\u002F\u002F [SPRING]\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n  @ExceptionHandler(MarketNotFoundException.class)\n  public ResponseEntity\u003CErrorResponse> handle(MarketNotFoundException ex) {\n    return ResponseEntity.status(404).body(ErrorResponse.from(ex));\n  }\n}\n\n\u002F\u002F [QUARKUS] Option A: ExceptionMapper\n@Provider\npublic class MarketNotFoundMapper implements ExceptionMapper\u003CMarketNotFoundException> {\n  @Override\n  public Response toResponse(MarketNotFoundException ex) {\n    return Response.status(404).entity(ErrorResponse.from(ex)).build();\n  }\n}\n\n\u002F\u002F [QUARKUS] Option B: @ServerExceptionMapper (RESTEasy Reactive)\n@ServerExceptionMapper\npublic RestResponse\u003CErrorResponse> handle(MarketNotFoundException ex) {\n  return RestResponse.status(Status.NOT_FOUND, ErrorResponse.from(ex));\n}\n```\n\n## Generics and Type Safety\n\n- Avoid raw types; declare generic parameters\n- Prefer bounded generics for reusable utilities\n\n```java\npublic \u003CT extends Identifiable> Map\u003CLong, T> indexById(Collection\u003CT> items) { ... }\n```\n\n## Project Structure\n\n### [SPRING] Maven\u002FGradle\n\n```\nsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fapp\u002F\n  config\u002F\n  controller\u002F\n  service\u002F\n  repository\u002F\n  domain\u002F\n  dto\u002F\n  util\u002F\nsrc\u002Fmain\u002Fresources\u002F\n  application.yml\nsrc\u002Ftest\u002Fjava\u002F... (mirrors main)\n```\n\n### [QUARKUS] Maven\u002FGradle\n\n```\nsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fapp\u002F\n  config\u002F              # @ConfigMapping, @ConfigProperty beans, Producers\n  resource\u002F            # JAX-RS resources (not \"controller\")\n  service\u002F\n  repository\u002F          # PanacheRepository implementations (if not using active record)\n  domain\u002F              # JPA\u002FPanache entities, MongoDB entities\n  dto\u002F\n  util\u002F\n  mapper\u002F              # MapStruct mappers (if used)\nsrc\u002Fmain\u002Fresources\u002F\n  application.properties   # Quarkus convention (YAML supported with quarkus-config-yaml)\n  import.sql               # Hibernate auto-import for dev\u002Ftest\nsrc\u002Ftest\u002Fjava\u002F... (mirrors main)\n```\n\n## Formatting and Style\n\n- Use 2 or 4 spaces consistently (project standard)\n- One public top-level type per file\n- Keep methods short and focused; extract helpers\n- Order members: constants, fields, constructors, public methods, protected, private\n\n## Code Smells to Avoid\n\n- Long parameter lists → use DTO\u002Fbuilders\n- Deep nesting → early returns\n- Magic numbers → named constants\n- Static mutable state → prefer dependency injection\n- Silent catch blocks → log and act or rethrow\n- **[QUARKUS]**: `@Singleton` where `@ApplicationScoped` is intended — breaks proxying and interception\n- **[QUARKUS]**: Mixing `quarkus-resteasy-reactive` and `quarkus-resteasy` (classic) — pick one stack\n- **[QUARKUS]**: Panache active-record + repository pattern in the same bounded context — pick one\n\n## Logging\n\n```java\n\u002F\u002F [SPRING] SLF4J\nprivate static final Logger log = LoggerFactory.getLogger(MarketService.class);\nlog.info(\"fetch_market slug={}\", slug);\nlog.error(\"failed_fetch_market slug={}\", slug, ex);\n\n\u002F\u002F [QUARKUS] JBoss Logging (default, zero-cost at build time)\nprivate static final Logger log = Logger.getLogger(MarketService.class);\nlog.infof(\"fetch_market slug=%s\", slug);\nlog.errorf(ex, \"failed_fetch_market slug=%s\", slug);\n\n\u002F\u002F [QUARKUS] Alternative: simplified logging with @Inject\n@Inject\nLogger log; \u002F\u002F CDI-injected, scoped to declaring class\n```\n\n## Null Handling\n\n- Accept `@Nullable` only when unavoidable; otherwise use `@NonNull`\n- Use Bean Validation (`@NotNull`, `@NotBlank`) on inputs\n- **[QUARKUS]**: Apply `@Valid` on `@BeanParam`, `@RestForm`, and request body parameters\n\n## Configuration\n\n```java\n\u002F\u002F [SPRING] @ConfigurationProperties\n@ConfigurationProperties(prefix = \"market\")\npublic record MarketProperties(int maxPageSize, Duration cacheTtl) {}\n\n\u002F\u002F [QUARKUS] @ConfigMapping (type-safe, build-time validated)\n@ConfigMapping(prefix = \"market\")\npublic interface MarketConfig {\n  int maxPageSize();\n  Duration cacheTtl();\n}\n\n\u002F\u002F [QUARKUS] Simple values with @ConfigProperty\n@ConfigProperty(name = \"market.max-page-size\", defaultValue = \"100\")\nint maxPageSize;\n```\n\n## Testing Expectations\n\n### Shared\n- JUnit 5 + AssertJ for fluent assertions\n- Mockito for mocking; avoid partial mocks where possible\n- Favor deterministic tests; no hidden sleeps\n\n### [SPRING]\n- `@WebMvcTest` for controller slices, `@DataJpaTest` for repository slices\n- `@SpringBootTest` reserved for full integration tests\n- `@MockBean` for replacing beans in Spring context\n\n### [QUARKUS]\n- Plain JUnit 5 + Mockito for unit tests (no `@QuarkusTest`)\n- `@QuarkusTest` reserved for CDI integration tests\n- `@InjectMock` for replacing CDI beans in integration tests\n- Dev Services for database\u002FKafka\u002FRedis — avoid manual Testcontainers setup when Dev Services suffice\n- `@QuarkusTestResource` for custom external service lifecycle\n\n```java\n\u002F\u002F [SPRING] Controller test\n@WebMvcTest(MarketController.class)\nclass MarketControllerTest {\n  @Autowired MockMvc mockMvc;\n  @MockBean MarketService marketService;\n}\n\n\u002F\u002F [QUARKUS] Integration test\n@QuarkusTest\nclass MarketResourceTest {\n  @InjectMock\n  MarketService marketService;\n\n  @Test\n  void should_return_404_when_market_not_found() {\n    given().when().get(\"\u002Fmarkets\u002Funknown\").then().statusCode(404);\n  }\n}\n\n\u002F\u002F [QUARKUS] Unit test (no CDI, no @QuarkusTest)\n@ExtendWith(MockitoExtension.class)\nclass MarketServiceTest {\n  @Mock MarketRepository marketRepository;\n  @InjectMocks MarketService marketService;\n}\n```\n\n**Remember**: Keep code intentional, typed, and observable. Optimize for maintainability over micro-optimizations unless proven necessary.\n",{"name":5,"metadata":24,"description":7},{"origin":25},"ECC","main","5d0a87185c0e172c3901e2a6e5916b6d544b8b94","skills\u002Fjava-coding-standards","https:\u002F\u002Fgithub.com\u002FJunMystery\u002FAgent-Guidance","https:\u002F\u002Fgithub.com\u002FJunMystery","AI is the typist, I am the architect. Building efficient, secure, and user-centric products through disciplined AI prompt engineering.","2026-11-13 17:41:25",{"source":8,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add JunMystery\u002FAgent-Guidance --skill java-coding-standards",{"tool":39,"command":40},"bunx","bunx skills add JunMystery\u002FAgent-Guidance --skill java-coding-standards",{"tool":42,"command":43},"pnpm","pnpm dlx skills add JunMystery\u002FAgent-Guidance --skill java-coding-standards","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJunMystery\u002FAgent-Guidance\u002Fblob\u002Fmain\u002Fskills\u002Fjava-coding-standards\u002FSKILL.md",true,[],[48,54,60,66,72,78],{"skillNo":49,"name":50,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":53,"publishedAt":19},"01M79QR1E309VJ6CTQKB32AWWA","zero-trust-architecture-cheat-sheet","https:\u002F\u002Fgithub.com\u002FJunMystery\u002FAgent-Guidance\u002Fblob\u002Fmain\u002Fskills\u002Fzero-trust-architecture-cheat-sheet\u002FSKILL.md",[],[],{"skillNo":55,"name":56,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":19},"01M79QQV7GHYR02DYGN41S23WN","xss-filter-evasion-cheat-sheet","https:\u002F\u002Fgithub.com\u002FJunMystery\u002FAgent-Guidance\u002Fblob\u002Fmain\u002Fskills\u002Fxss-filter-evasion-cheat-sheet\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":19},"01M79QQNSN7YB8XB61FFSCS3WH","xs-leaks-cheat-sheet","https:\u002F\u002Fgithub.com\u002FJunMystery\u002FAgent-Guidance\u002Fblob\u002Fmain\u002Fskills\u002Fxs-leaks-cheat-sheet\u002FSKILL.md",[],[],{"skillNo":67,"name":68,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":19},"01M79QQHZZJKFDY9132G5A65C2","xpath-injection-prevention-cheat-sheet","https:\u002F\u002Fgithub.com\u002FJunMystery\u002FAgent-Guidance\u002Fblob\u002Fmain\u002Fskills\u002Fxpath-injection-prevention-cheat-sheet\u002FSKILL.md",[],[],{"skillNo":73,"name":74,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":19},"01M79QQB9ZSD3DJG8658EHQXR1","xml-security-cheat-sheet","https:\u002F\u002Fgithub.com\u002FJunMystery\u002FAgent-Guidance\u002Fblob\u002Fmain\u002Fskills\u002Fxml-security-cheat-sheet\u002FSKILL.md",[],[],{"skillNo":79,"name":80,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M79QQ60WKV7PFMXWT9CW8PM6","xml-external-entity-prevention-cheat-sheet","https:\u002F\u002Fgithub.com\u002FJunMystery\u002FAgent-Guidance\u002Fblob\u002Fmain\u002Fskills\u002Fxml-external-entity-prevention-cheat-sheet\u002FSKILL.md",[],[]]